sakuya452 发表于 2017-12-21 20:07:41

冒险地图将DEF与英雄编号关联的例子

本帖最后由 sakuya452 于 2017-12-28 23:22 编辑

如果没啥BUG,我就和以前一样先跑路了;iunei;

测试交给大家,多试久点,不急;juwe;之前已知的与大型MOD封神同时使用下,进入一次战斗后,则下次载入地图(包括载入存档),就会crash的问题,稍微查了下,封神某脚本触发战斗时就将z802变量清0了..还用了z801变量空间,撞车撞的好巧,因此我更换下自己脚本的使用的z变量

最好测试时尽可能排除其它脚本的干扰,以减少因为脚本冲突而出错的可能性
ZVSE

**使用z809-z810的空间来记录新状态的数据,z811用于释放申请的内存,请勿作它用

**首次PI或GM0前不触发,如果下一次会触发PI或GM0,则在PI或GM0前,且在清零v、z变量以及SN:W变量并释放其引用前触发
!?FU56003;
!!UN:C4715914/4/210209931;                      [帧逻辑还原部分1
!!UN:C4715918/2/1;
!!UN:C4715920/1/0;                              ]

!!UN:C4715587/4/210144395;                      [帧逻辑还原部分2
!!UN:C4715591/2/1;
!!UN:C4715593/1/0;                              ]

!!UN:C4716662/4/210144395;                      [帧逻辑还原部分3
!!UN:C4716666/2/1;
!!UN:C4716668/1/0;                              ]

!!UN:C4261535/4/210209931;                      [帧逻辑还原部分4
!!UN:C4261539/2/1;
!!UN:C4261541/1/0;                              ]

!!UN:C4260351/4/210209931;                      [帧逻辑还原部分5
!!UN:C4260355/2/1;
!!UN:C4260357/1/0;                              ]

!!UN:C4260227/4/210732171;                      [帧逻辑还原部分6,改了就还原呗
!!UN:C4260231/2/1;
!!UN:C4260233/1/0;                              ]

!!UN:C4261411/4/210732171;                      [帧逻辑还原部分7,改了就还原呗
!!UN:C4261415/2/1;
!!UN:C4261417/1/0;                              ]

!!UN:C4223727/1/232;                            [载入逻辑还原
!!UN:C4223728/4/1398476;                        ]

!!UN:C4223759/1/232;                            [特殊处理还原
!!UN:C4223760/4/943644;                         ]

!!UN:C7677353/1/185;                            [跳转到z800的指令部分还原1
!!UN:C7677354/4/42643408;                     ]

!!UN:C5193633/1/232;                            [跳转到z800的指令部分还原2
!!UN:C5193634/4/419818;                         ]

!?PI;
!!FU60000:P800801802;

!?GM0;
!!FU60000:P800801802;

!?FU60000;
!!FU&x1<>800801802:E;

!!SN:L^Kernel32.dll^/?y1;
!!SN:Ay1/^VirtualAlloc^/?y2 Ay1/^VirtualFree^/?y3;
!!SN:L^angel.dll^/?y1;
!!SN:Ay1/^SaveEventParams^/?y4 Ay1/^GenerateCustomErmEvent^/?y5 Ay1/^RestoreEventParams^/?y6;

!!SN:Ey2/1/0/8192/1060864/64;
!!FU&v1=0:E;
!!SN:W^startAddress^/v1;
!!SN:W^myOffsetAddress^/v1;
!!SN:W^startAddress^/?y10;
!!VRy20:Sy10+512;
!!SN:W^defStartAddress^/y20;

!!UN:C4715914/1/232;                            [帧逻辑修改部分1
!!VRy9:Sy10-4715915-4;
!!UN:C4715915/4/y9;
!!UN:C4715919/2/37008;

!!UN:Cy10/4/2329030994;
!!VRy10:+4;
!!UN:Cy10/4/210449491;
!!VRy10:+4;
!!UN:Cy10/1/149;
!!VRy10:+1;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/2/50010;
!!VRy10:+2;                                     ]

!!UN:C4715587/1/232;                            [帧逻辑修改部分2
!!VRy9:Sy10-4715588-4;
!!UN:C4715588/4/y9;
!!UN:C4715592/2/37008;

!!UN:Cy10/4/2329030994;
!!VRy10:+4;
!!UN:Cy10/4/210449495;
!!VRy10:+4;
!!UN:Cy10/1/149;
!!VRy10:+1;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/2/50010;
!!VRy10:+2;                                     ]

!!UN:C4716662/1/232;                            [帧逻辑修改部分3
!!VRy9:Sy10-4716663-4-15;
!!UN:C4716663/4/y9;
!!UN:C4716667/2/37008;                        ]

!!UN:C4261535/1/232;                            [帧逻辑修改部分4
!!VRy9:Sy10-4261536-4;
!!UN:C4261536/4/y9;
!!UN:C4261540/2/37008;

!!UN:Cy10/4/2329030994;
!!VRy10:+4;
!!UN:Cy10/4/210449494;
!!VRy10:+4;
!!UN:Cy10/1/149;
!!VRy10:+1;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/2/50010;
!!VRy10:+2;                                     ]

!!UN:C4260351/1/232;                            [帧逻辑修改部分5
!!VRy9:Sy10-4260352-4-15;
!!UN:C4260352/4/y9;
!!UN:C4260356/2/37008;                        ]

!!UN:C4260227/1/232;                            [帧逻辑修改部分6,感觉没啥影响,可以去掉测测
!!VRy9:Sy10-4260228-4;
!!UN:C4260228/4/y9;
!!UN:C4260232/2/37008;

!!UN:Cy10/4/2329030994;
!!VRy10:+4;
!!UN:Cy10/4/76231766;
!!VRy10:+4;
!!UN:Cy10/1/149;
!!VRy10:+1;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/2/50010;
!!VRy10:+2;                                     ]

!!UN:C4261411/1/232;                            [帧逻辑修改部分7,感觉没啥影响,可以去掉测测
!!VRy9:Sy10-4261412-4-15;
!!UN:C4261412/4/y9;
!!UN:C4261416/2/37008;                        ]

!!UN:C4223727/1/233;                            [载入英雄def资源时另存到自己的地址处,并为每个编号非特殊英雄分配一个地址
!!VRy9:Sy10-4223728-4;
!!UN:C4223728/4/y9;

!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:S5622208-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/4/99008864;
!!VRy10:+4;
!!UN:Cy10/2/48781;
!!VRy10:+2;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/1/185;
!!VRy10:+1;
!!UN:Cy10/4/8;
!!VRy10:+4;
!!UN:Cy10/4/3915492339;
!!VRy10:+4;
!!VRy9:S4223732-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;                                     ]

!!UN:C4223759/1/233;                            [处理编号中特殊英雄部分
!!VRy9:Sy10-4223760-4;
!!UN:C4223760/4/y9;

!!UN:Cy10/2/41312;
!!VRy10:+2;
!!UN:Cy10/4/y20;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+576;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+584;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+608;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+64;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+592;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+160;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+588;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+192;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+620;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+256;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+600;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+320;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+604;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+612;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+384;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+596;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+616;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/161;
!!VRy10:+1;
!!VRy9:Sy20+480;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/163;
!!VRy10:+1;
!!VRy9:Sy20+580;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/232;                              56002触发器部分,用于载入后还原数据
!!VRy10:+1;
!!VRy9:Sy4-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/104;
!!VRy10:+1;
!!UN:Cy10/4/56002;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy5-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy6-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/2/59489;
!!VRy10:+2;
!!VRy9:S5167408-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/233;
!!VRy10:+1;
!!VRy9:S4223764-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;                                     ]

!!VRy10:S10012648;                              [z811变量空间

!!UN:C7677353/1/233;                           载入地图时PI或GM0前释放内存部分
!!VRy9:Sy10-7677354-4;
!!UN:C7677354/4/y9;

!!UN:Cy10/2/26720;
!!VRy10:+2;
!!UN:Cy10/4/32768;
!!VRy10:+4;
!!UN:Cy10/2/106;
!!VRy10:+2;
!!UN:Cy10/1/104;
!!VRy10:+1;
!!SN:W^startAddress^/?y9;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy3-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:Cy10/1/232;                                 56003触发器部分,用于载入地图时还原指令
!!VRy10:+1;
!!VRy9:Sy4-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/104;
!!VRy10:+1;
!!UN:Cy10/4/56003;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy5-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy6-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/2/47457;
!!VRy10:+2;
!!UN:Cy10/4/42643408;
!!VRy10:+4;
!!UN:Cy10/1/233;
!!VRy10:+1;
!!VRy9:S7677358-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;

!!UN:C5193633/1/233;                           退出程序时执行的释放内存指令部分
!!VRy9:Sy10-5193634-4;
!!UN:C5193634/4/y9;

!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:S5613456-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/2/26720;
!!VRy10:+2;
!!UN:Cy10/4/32768;
!!VRy10:+4;
!!UN:Cy10/2/106;
!!VRy10:+2;
!!UN:Cy10/1/104;
!!VRy10:+1;
!!SN:W^startAddress^/?y9;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/1/232;
!!VRy10:+1;
!!VRy9:Sy3-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;
!!UN:Cy10/2/59745;
!!VRy10:+2;
!!VRy9:S5193638-y10-4;
!!UN:Cy10/4/y9;
!!VRy10:+4;                                     ]

**以上如无必要,请勿修改

**载入18个原本的英雄def字符串资源后触发
!?FU56002;
!!VRy1:S10011624;                               z809地址
!!SN:W^defStartAddress^/?y20;
!!DO60001/0/155/1:Py1/y20;                      遍历英雄编号

!?FU60001;
!!VRy1:Sx16*4+x1;                               [按自己的逻辑使用z变量空间的值来还原状态,根据情况可能要扩大使用的z变量空间
!!UN:Cy1/4/?y2;
!!FU&y2=0:E;
!!SN:E5622208/2/y2;
!!VRy3:Sx16*4+x2;
!!UN:Cy3/4/v1;                                  ]

**冒险地图右键换欧灵和塞亚和姆拉克爵士def
!?CM0;
!!SN:W^defStartAddress^/?y20;   获取用于存放对应英雄编号的def的自己结构首地址
!!VRy10:S10011624;                z809地址

**绕个弯获取55C9C0函数所需的def字符串资源地址
!!VRy1:S0 R17;                  18个英雄类型def
!!VRy2:Sy1*4+6682024;             65F5A8开始的每4个字节,存放着 地图上英雄类型def字符串的地址,随机从18个中选一个
!!UN:Cy2/4/?y3;                   从选到的指针处获取def字符串资源地址

!!SN:E5622208/2/y3;               传递def字符串地址参数获取显示def依据的指针,存放在返回值中
!!VRy5:S144*4+y20;                这个地址开始处的4字节是显示编号0的英雄def,再加4是编号1的,再多4就是下一个的,依次类推
!!UN:Cy5/4/v1;                  修改姆拉克爵士def

**将英雄编号与def字符串资源地址绑定的逻辑,为了载入时能还原状态,请务必在修改某编号英雄def后,
**按逻辑在指定的z变量空间(本例中是z798-z799)中指定位置记录下来,如改了欧灵def(编号0),本例中
**就是在(z798地址+(编号*4))处写入4字节数据(就是为了修改英雄def而调用55C9C0函数时传递的参数)
!!VRy9:S144*4+y10;
!!UN:Cy9/4/y3;

**直接从字符串资源中选择,将其地址作为参数来调用55C9C0函数,在内存地址0065FF88附近都是def字符串资源,
**根据情况可能会需要修改定位和还原逻辑
**当然,不是所有def都能正确显示,要尽量符合英雄def的规范
!!VRy1:S0 R2;
!!VRy2:Sy1*12+6683928;            65FD18处是一种船,从3种船中选一个
!!SN:E5622208/2/y2;               [修改欧灵def,传说中的沙漠之舟?
!!VRy5:S0*4+y20;
!!UN:Cy5/4/v1;                  ]

!!VRy9:S0*4+y10;                  [同样记录下
!!UN:Cy9/4/y2;                  ]

**根据指定文件内存在的def文件名字符串(应该不区分大小写,以0为结束标志)替换,但暂且不保存,因为涉及还原逻辑的修改
!!VRz812:S^avwazure.def^;
!!SN:E5622208/2/10013160;         [修改塞亚def,嗯,这是只圣龙,10013160为z812变量地址
!!VRy5:S13*4+y20;
!!UN:Cy5/4/v1;                  ]

贤知有您 发表于 2017-12-21 21:16:49

哇靠,这么复杂,难怪我看不下去。
;aieol;
给楼主大大的赞赏
:good_job:

先记下来,有空就测试测试。
感谢楼主的贡献
;aiel;

兽哥哥 发表于 2017-12-22 12:00:38

哥完全看不懂;lan;
页: [1]
查看完整版本: 冒险地图将DEF与英雄编号关联的例子

捐赠