赞 45
VIP 0
好人卡 0
积分 146
经验 0
最后登录 2024-11-21
在线时间 2196 小时
Lv4.逐梦者
梦石 0
星屑 14616
在线时间 2196 小时
注册时间 2019-1-24
帖子 1123
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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方法是干啥的
if element_set == []
# 返回 100
return 100
end 复制代码
从这段代码可以看出来,如果没有勾选任何属性的话,就返回100
for i in element_set
#p element_rate(i)
weakest = [weakest, self.element_rate(i)].max
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了下
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是获得属性修正值的意思。
到此本应该完事,发现下面还有最后一句:
# 状态能防御本属性的情况下效果减半
for i in @states
if $data_states[i].guard_element_set.include?(element_id)
result /= 2
end
end 复制代码 大体意思是遍历角色状态数组,如果这个状态被勾选了,则刚才算出来的值减半。
也就是勾选这个地方的属性有效度会减去一半属性。
所以大家可以通过数据库---状态--属性--这里面勾选后,然后在这段代码里面加一些判断,
个人猜想,可以这样做一些效果。
最后:说下角色里面的
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
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
可以看出来,角色的防具如果勾选了属性防御,则会减免对应攻击者的属性。
最终回到,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
不一定对,以上都是通过分析基础代码想到的一些修改方向,如果可能的话以后会继续分析别的代码。
下次准备写,和我一起来读脚本--第一第二命中关系与区别
评分
查看全部评分