设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2732|回复: 6
打印 上一主题 下一主题

[讨论] 和我一起读脚本--属性修正

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2021-9-10 16:59:58 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 miantouchi 于 2021-9-11 11:58 编辑

现在用XP得基本上都是大佬了吧,很少有不会脚本的小白了吧。因为做游戏和XP结下了不解之缘,后来又因论坛众多大佬的指点才走到今天,并不是说我已经学到了大佬的精髓了,现在也是啥也不是,但是发现只要人不要放弃,坚持不懈一些以前不明白的也会慢慢的读懂了。
写这个原因有以下4点
1.全当自己的学脚本笔记
2.抛砖引玉,从初学者的脚本看问题。大佬也找找当年的感觉
3.也献给和我一样的不会脚本的人,能对他们有点帮助。
4.活跃下论坛气氛。
今天的读脚本,属性修正。
作为一个XP小白,炸一看,数据库当中,
职业、敌人          :包含   ”属性有效度”,”状态有效度”
特技、物品、武器:包含   ”属性”和“状态变化”
防御、状态          :包含   “属性防御”和“状态变化”我这几项的区别一直都是混乱的。。。今天研究了下终于开点窍

首先:我选定了Game_Battler 3 里面普通攻击,研究主内容是我方的阿尔西斯装备铜剑去砍幽灵
self.damage *= elements_correct(attacker.element_set)这句话是属性修正就研究这句代码究竟干了啥。

接着我在数据库里面铜剑勾选了 雷、水、风,三项目属性,最后  p attacker.element_set
看下结果,得到结果是数组  [3,4,6],也就是雷、水、风对应的数组位(通过F1里面可以看到数组结构)
现在我们要看看attacker.element_set 是啥,字面看是攻击者属性,接着搜索脚本看看。





分别在Game_Actor和Game_Enemy里面定义的,
角色的值取决于装备的武器
怪物则返回空数组,表示无属性。
通过weapon.element_set,这句获得武器所带的属性ID也就是[3,4,6]

拿到了武器属性ID后,接着看elements_correct方法是干啥的
  1.     if element_set == []
  2.       # 返回 100
  3.       return 100
  4.     end
复制代码

从这段代码可以看出来,如果没有勾选任何属性的话,就返回100
  1. for i in element_set
  2.       #p element_rate(i)
  3.       weakest = [weakest, self.element_rate(i)].max
  4.     end
复制代码
因为刚刚获得了[3,4,6]
通过这个for循环去挨个带入这句代码 self.element_rate(i)
也就是
self.element_rate(3)
self.element_rate(4)
self.element_rate(6)
通过数组取最大值来确定最小可以取-100
接下来,我们看看element_rate是干啥的。



通过全局搜索,发现也是
Game_Actor和Game_Enemy里面都定义了,因为我们本次是看玩家攻击敌人
self.element_rate(i),self代表被攻击着也就是Game_Enemy里面的element_rate


我们先设置铜剑的雷、水、风3个属性对于怪物的有效度,设置下怪物里面的:属性有效度。

下面我们来看下Game_Enemy里面的element_rate
首先我p了下
  1. p $data_enemies[@enemy_id].element_ranks[element_id]
复制代码
分别得到了1,6,2,这3个值,查看F1
element_ranks 属性有效度。是以属性 ID 为索引的一维数组(Table),其值分 6 级(0:A,1:B,2:C,3:D,4:E,5:F)。
由此,可以看出来F1里面写错了,1代表A ,6代表F,2代表B,正好是取得属性有效度的意思。最后通过table[1],table[6],table[2],分别取得200,-100,150这3个值,由此我们知道了element_rate是获得属性修正值的意思。
到此本应该完事,发现下面还有最后一句:
  1.     # 状态能防御本属性的情况下效果减半
  2.     for i in @states
  3.       if $data_states[i].guard_element_set.include?(element_id)
  4.         result /= 2
  5.       end
  6.     end
复制代码
大体意思是遍历角色状态数组,如果这个状态被勾选了,则刚才算出来的值减半。

也就是勾选这个地方的属性有效度会减去一半属性。
所以大家可以通过数据库---状态--属性--这里面勾选后,然后在这段代码里面加一些判断,
个人猜想,可以这样做一些效果。
最后:说下角色里面的
RUBY 代码复制
  1. for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
  2.       armor = $data_armors
  3.       if armor != nil and armor.guard_element_set.include?(element_id)
  4.         result /= 2
  5.       end
  6.     end

可以看出来,角色的防具如果勾选了属性防御,则会减免对应攻击者的属性。
最终回到,def attack_effect(attacker)里面的self.damage /= 100,
这句代码会把伤害计算出来伤害是提升了还是降低了


总结下数据库里面:
职业、敌人          :包含   ”属性有效度”,”状态有效度”
特技、物品、武器:包含   ”属性”和“状态变化”
防御、状态          :包含   “属性防御”和“状态变化
1.职业---属性有效度:该职业角色对不同属性伤害的修正值
2.敌人---属性有效度:该敌人对不同属性伤害的修正值
3.武器---属性:勾选后角色通过武器的属性获取属性修正
4.防御---属性防御:是角色穿的防具,如果勾选了相应的属性防御,被敌人攻击时对应属性伤害减半。
5.状态---属性防御:是角色或者敌人被攻击时对应属性伤害减半。

总体过程就是,玩家装备了一件带属性的武器,首先获得该武器打勾的有哪些属性,
并且找到这些属性的ID,然后通过这些属性ID去找对应被攻击的是角色(职业数据库)/敌人  就是数据库里面的属性有效度选择A-F这个范围,
通过这个有效度计算出所勾选有效度当中最高的值。
最后看一下,玩家的防具(数据库)和状态(数据库)里面有没有设置 属性防御打勾,如果有打勾的话就会减半,
怪物只有状态数据库减半效果。


一些想法:
1.一些大大可以直接改elements_correct(attacker.element_set) ,全盘不用默认的属性修正
2.table = [0,200,150,100,50,0,-100]可以修改这里面的内容,达到不同比例。
3.可以修改下面防具修正代码,不同防具不同修正
    # 防具能防御本属性的情况下效果减半
    for i in [@armor1_id, @armor2_id, @armor3_id, @armor4_id]
      armor = $data_armors
      if armor != nil and armor.guard_element_set.include?(element_id)
        result /= 2
      end
    end
4.可以修改下面状态修正代码,不同状态不同修正
    # 状态能防御本属性的情况下效果减半
    for i in @states
      if $data_states.guard_element_set.include?(element_id)
        result /= 2
      end
    end
5.猜想可以改造下面的内容来给怪物带来默认的属性攻击修正,也就是给怪物带有不同攻击属性。
  def element_set
    return []
  end

不一定对,以上都是通过分析基础代码想到的一些修改方向,如果可能的话以后会继续分析别的代码。

下次准备写,和我一起来读脚本--第一第二命中关系与区别

评分

参与人数 2星屑 +120 +2 收起 理由
RyanBern + 120 + 1 精品文章
enghao_lim + 1 塞糖

查看全部评分

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

2
发表于 2021-9-10 20:46:36 手机端发表。 | 只看该作者
写的很好,good!
(还有如果将来出现了脚本小白,就靠你带他们了,宝妈酱✧و(•'-'•|。

点评

带小白是白费,水平不行,自己还半瓶不满  发表于 2021-9-10 21:35
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
帖子
1223
3
发表于 2021-9-10 21:45:11 | 只看该作者
。。。还是感觉直接看汉化版的mv的同项的提示更加清晰(XP它。。。貌似va也行,XP感觉功能比较。。。)
脚本的话,唔。。。

点评

嗯,现在新手都用mz和mv了吧,我也是为了做的游戏才学的xp。毕竟是老古董了,受众少一些,剩下来的基本都是大触。  发表于 2021-9-10 22:19
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7981
在线时间
1183 小时
注册时间
2007-7-29
帖子
2055
4
发表于 2021-9-10 23:01:42 | 只看该作者
Game_Actor和Game_Enemy都是Game_Battler的子类,它们会有共通函数。

第二:
最终回到,def attack_effect(attacker)里面的self.damage /= 100,
这句代码会把伤害计算出来伤害是提升了还是降低了

因为默认的属性修正是提升 一百的倍数 => [0,200,150,100,50,0,-100],如果不/100让数值回到原有值那这个buff挺恐怖的……。
比如A级有效修正为 damage * 200,要是接着不 /= 100的话就是200倍buff

点评

说到重点了  发表于 2021-9-11 06:49
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-22 08:57

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表