贤知有您 发表于 2021-2-1 17:14:12

【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.圣侏儒守卫的堆栈记录,只有在战斗开始时有效。在战斗期间,由于堆栈编号(相关数据)可能会被重新利用,不能保证准确性。


Archer30 发表于 2021-4-19 03:16:00

这里贴一个用楼主的方式写好的圣诞妖精平衡性修改脚本。仅适用于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:;






XEricSin 发表于 2021-2-2 00:03:52

记下了,不过感觉不会用得上

凌茂冲 发表于 2021-2-2 09:02:13

不明觉厉,敬仰敬仰

堕落尜尕 发表于 2024-6-15 18:06:55

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这一段了,毕竟圣诞妖精施法种类只有一种


Archer30 发表于 2024-6-15 22:45:21

堕落尜尕 发表于 2024-6-15 18:06
我直接复制您的脚本后发现圣诞妖精的伤害没有改变;是不是第54行的 S?(spell:y) 语句无法检测到生物的施 ...

这里不应该检查BG:S,你改的内容是对的
页: [1]
查看完整版本: 【ERM】如何获取圣侏儒守卫的堆栈编号

捐赠