地图全开
00481F9D |> \0FBF56 26 movsx edx, word ptr [esi+26]
00481FA1 |. 0FBF46 24 movsx eax, word ptr [esi+24]
00481FA5 |. 52 push edx
00481FA6 |. 50 push eax
00481FA7 |. 68 10D08100 push 0081D010 ; ASCII "Crate at %d,%d contains 'reveal'",LF
00481FAC |. E8 2F49F8FF call 004068E0 ; 空函数
00481FB1 |. 8B4D 08 mov ecx, dword ptr [ebp+8]
00481FB4 |. 83C4 0C add esp, 0C
00481FB7 |. 8B91 1C020000 mov edx, dword ptr [ecx+21C]
00481FBD |. B9 E8F78700 mov ecx, 0087F7E8
00481FC2 |. 52 push edx
00481FC3 |. E8 C85D0F00 call 00577D90 ; 地图全开
2024年1月3日:已验证可行性。
// 全地图内联代码
void Map_Assemble() {
_asm {
pushad
mov eax,0x00A83D4C
mov edx,[eax]
mov ecx,0x0087F7E8
push edx
mov eax,0x00577D90
call eax
popad
}
}
雷达开启
以下汇编仅作过程分析的参考:
00508DF0 /$ C681 79570000>mov byte ptr [ecx+5779], 0
00508DF7 |. A1 4C3DA800 mov eax, dword ptr [A83D4C]
00508DFC |. 83EC 0C sub esp, 0C
00508DFF |. 3BC8 cmp ecx, eax
00508E01 |. 0F85 4D010000 jnz 00508F54
00508E07 |. 8B81 B8020000 mov eax, dword ptr [ecx+2B8]
00508E0D |. 53 push ebx
00508E0E |. 55 push ebp
00508E0F |. 56 push esi
00508E10 |. 8BB1 B0020000 mov esi, dword ptr [ecx+2B0]
00508E16 |. 57 push edi
00508E17 |. 83FE FF cmp esi, -1
00508E1A |. C64424 10 00 mov byte ptr [esp+10], 0
00508E1F |. 74 0E je short 00508E2F
00508E21 |. 8B15 84EDA800 mov edx, dword ptr [A8ED84]
00508E27 |. 2BD6 sub edx, esi
00508E29 |. 3BD0 cmp edx, eax
00508E2B |. 7D 0A jge short 00508E37
00508E2D |. 2BC2 sub eax, edx
00508E2F |> 85C0 test eax, eax
00508E31 |. 0F85 F8000000 jnz 00508F2F
00508E37 |> A1 30B2A800 mov eax, dword ptr [A8B230]
00508E3C |. 8A90 A4340000 mov dl, byte ptr [eax+34A4]
00508E42 |. 84D2 test dl, dl ; 雷达开启判断
00508E44 |. 0F85 E0000000 jnz 00508F2A
2024年1月4日:已验证可行性,一键开启全图和雷达,无须修改指令。
//全地图内联代码
#pragma pack(1)
void Map_Assemble() {
_asm {
pushad
mov eax, 0x00A83D4C
mov edx, [eax]
mov ecx, 0x0087F7E8
push edx
mov eax,0x00577D90
call eax
popad
}
}
// 雷达全开 [[0x00A8B230] + 0x34A4] = 1
void RadarOn_Assemble() {
_asm {
pushad
mov eax, 0x00A8B230
mov eax, [eax]
mov byte ptr [eax + 0x34A4], 0x1
popad
}
}
// 判断游戏是否运行
bool isGameRunning() {
bool isRunning = false;
__try {
_asm {
pushad
mov eax, 0x00A83D4C
mov eax, [eax]
mov eax, 0x0087F7E8
mov eax, [eax]
popad
}
isRunning = true;
} __except (EXCEPTION_EXECUTE_HANDLER) {
isRunning = false;
}
return isRunning;
}
#pragma pack()
调用:
//地图全开
void openAllMap() {
if (isGameRunning()) {
Map_Assemble();
RadarOn_Assemble();
} else {
::Beep(523, 400); // do
}
}
其他:
- 对 00577D90 函数下断点,创建雷达后断下来跟踪。
- 找到地址: 0x00A83D4C 0x0087F7E8 0x00A8B230 0x34A4 之间的关系和来源,最好能从一个地址出发找到其他地址。
无限信标
联网对战的时候最多只能放置三个信标,当超过三个时需要把多余的删除掉才能放置新的信标,这样就会造成一个麻烦:战况激烈的时候,想放置信标的时候放置不了,还需要在地图上删除一个信标才能继续放置。
解决思路:RA2YurisRevengeTrainer/issues/19
如何使用
编译项目 Ra2Tool ,使用任意注入工具把 Ra2Dll.dll
模块注入到游戏进程即可(RATrainer 用不到)。
如果使用HookLoader工具,可以参考如下使用步骤:
【使用说明】 1、运行exe 2、进入游戏之后按下快捷键【ALT + H】即可,一定要进入游戏,保险起见是在出现基地之后,其他场景没测试过。
【作者有话】 全图功能我认为对级别低的玩家比较有帮助,对级别高的玩家帮助没有那么大。其他影响游戏平衡的变态功能全部删除了,只保留了全图这个功能,不然就没有可玩性了。
参考
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/sec/red-alert2.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)