【ERM】如何获取圣侏儒守卫的堆栈编号
本帖最后由 贤知有您 于 2021-2-1 17:26 编辑最近常和Archer30讨论erm脚本,其中有一个问题比较有趣。
问题:在战场第一回合,如何获得圣侏儒守卫的堆栈编号(比如用于调整守卫的数据)?
圣侏儒周围一圈会衍生出守卫来(放置生物),初看起来,要获取守卫只要检测圣侏儒周围一圈即可。
圣侏儒的守卫生物类型,只有2个要素,第一是英雄的所属,第二是塔楼的圣侏儒升级后守卫也会升级。
那么,判别侏儒守卫,只需要判定圣侏儒周围6格范围的坐标,及坐标上是否有对应的生物类型。
严谨著称的Archer30一眼就看出问题来,只要有战术的话,这种判断就不一定能生效。
这样一来,貌似还真没有一个准确处理的方式了。我想,也许只能用hook才能完美处理了。
结果在研究hook的时候,突然想起圣侏儒的守卫特征细节来。
当圣侏儒自身死亡后,它的守卫能够重新获得速度(开始时速度都是0),这个速度值是和守卫类型有关的。
既然游戏可以判别出哪个生物属于守卫,说明守卫是有一定的特征的(必定有数据记录)。
经过一番摸索终于找到了这个内部标志(数组结构),现摘录出来供大家参考。
(以下脚本使用了era2.8以上版本的循环语句,如果要用于era2.46需要把re的语法改为DO循环或者SN:G之类。)
!?BR&v997=0; [在战场第一回合触发,此时圣侏儒守卫已经放置完毕]
!!UN:C42336844/4/?y2; [获得圣侏儒守卫的堆栈的数量]
!!VRy2:-1; [为方便循环写法,这里-1,后面循环从0开始]
!!re y1/0/y2/1:;[遍历每队守卫]
!!VRy4:Sy1*16+42013744; [内部数据结构的地址,每队守卫分别有4个数据]
!!VRy5:Sy4+4; [数据分别是:源圣侏儒堆栈编号/守卫堆栈编号/守卫生物类型/守卫生物原始速度]
!!VRy6:Sy4+8;
!!VRy7:Sy4+12;
!!UN:Cy4/4/?y14 Cy5/4/?y15 Cy6/4/?y16 Cy7/4/?y17; [获得数据的值]
!!if&y14>=0/y14<42/y15>=0/y15<42:;[这里只是严谨性考虑的条件判断]
!!IF:M^源圣侏儒堆栈编号=%Y14 ,守卫堆栈编号=%Y15 ,守卫生物类型=%Y16 ,守卫生物原始速度=%Y17^;
<....这里放置你要处理的代码....>
!!en:;
!!en:;
补充一下:
1.ERA3.1之后的版本BR触发器进行过改造,第0回合只触发一次。而旧版(比如era2.46)的第0回合有可能触发2次(跟战术有关),需要留意一下。
2.圣侏儒守卫的堆栈记录,只有在战斗开始时有效。在战斗期间,由于堆栈编号(相关数据)可能会被重新利用,不能保证准确性。
这里贴一个用楼主的方式写好的圣诞妖精平衡性修改脚本。仅适用于ERA 3。
脚本的前面的变量数值(!#SN:W开头的语句)可以直接按照玩家需求进行设置(改变末尾的数字即可)。
分别可以对圣诞守卫的生命值、攻击力、防御力、弹药量、施法次数和每个圣诞妖精的霹雳寒冰伤害值进行设置。
ZVSE2
*Set Santa Guards attributes here*
*It detects the monsters around Santa Gremlins and changes their attributes*
!#SN:W^Santas_guards_health^/2;
!#SN:W^Santas_guards_attack^/2;
!#SN:W^Santas_guards_defense^/2;
!#SN:W^Santas_guards_shots^/1;
!#SN:W^Santas_guards_casts^/1;
!#SN:W^Santas_damage_scaling^/5;
****************************************************************************************************
!?FU(santa_LoadGlobalConfig);
!!VRi^Santas_guards_health^:F1/(INT_MAX);
!!VRi^Santas_guards_attack^:F0/(INT_MAX);
!!VRi^Santas_guards_defense^:F0/(INT_MAX);
!!VRi^Santas_guards_shots^:F0/(INT_MAX);
!!VRi^Santas_guards_casts^:F0/(INT_MAX);
!!VRi^Santas_damage_scaling^:F0/(INT_MAX);
!#FU(santa_LoadGlobalConfig);
!?FU(OnBattleRound)&v997=0;
!!UN:C42336844/4/?(value:y);
!!VR(value):-1;
!!re i/0/(value)/1;
!!VR(stackSantaAdd:y):Si *16 +42013744;
!!VR(stackGuardAdd:y):S(stackSantaAdd)+4;
*!VR(monGuardAdd:y):S(stackSantaAdd)+8;
*!VR(speedGuardAdd:y):S(stackSantaAdd)+12;
!!UN:C(stackGuardAdd)/4/?(stackGuard:y);
*!UN:C(stackSantaAdd)/4/?(stackSanta:y) C(monGuardAdd)/4/?(monGuard:y) C(speedGuardAdd)/4/?(speedGuard:y);
!!if&(stackGuard)>=0/(stackGuard)<42;
*!IF:M^guard_stack=%(stackGuard)^;
!!BM(stackGuard):Hi^Santas_guards_health^ Ai^Santas_guards_attack^ Di^Santas_guards_defense^;
!!BM(stackGuard):F?(flags:y) E?(casts:y);
!!VR(flags):&4;
!!BM(stackGuard)&(flags)=4:U3/i^Santas_guards_shots^;
!!BM(stackGuard)&(casts)>0:Ei^Santas_guards_casts^;
!!en;
!!en;
*Set the damage of the Ice Bolt attack from Santas*
!?MR1; [*Magical Combat Improvements*]
!!BG:A?(action:y) N?(stack:y);
!!BM(stack):T?(mon:y) N?(num:y);
!!MR:F?(dmg:y);
!!if&(action)=10/(mon)=173/(dmg)>0/(num)>0:;
!!VR(dmgNew:y):S(num) *i^Santas_damage_scaling^;
!!MR:F(dmgNew);
!!en:;
记下了,不过感觉不会用得上 不明觉厉,敬仰敬仰 Archer30 发表于 2021-4-19 03:16
这里贴一个用楼主的方式写好的圣诞妖精平衡性修改脚本。仅适用于ERA 3。
脚本的前面的变量数值(!#SN:W开 ...
我直接复制您的脚本后发现圣诞妖精的伤害没有改变;是不是第54行的 S?(spell:y) 语句无法检测到生物的施法编号?教程上写的是一般用于英雄施法,生物的话只能返回数值-1
然后我想试着用BM(stack):C?(spell:y)/d/d/d/d来检测生物施法,发现会报错提示BM:C的参数只能设置
所以最后我只能删除(spell)=16这一段了,毕竟圣诞妖精施法种类只有一种
堕落尜尕 发表于 2024-6-15 18:06
我直接复制您的脚本后发现圣诞妖精的伤害没有改变;是不是第54行的 S?(spell:y) 语句无法检测到生物的施 ...
这里不应该检查BG:S,你改的内容是对的
页:
[1]