日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

植物大战僵尸源代码

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 植物大战僵尸源代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近下了植物大戰僵尸的代碼,卻發現我什么也看不懂,嗚呼哀哉。

分析數據:

游戲基址:6a9ec0 768
陽光: 5560 768 6a9ec0
最多幾個植物:6a9ec0 768 144 24
準備了幾個植物:d24 774 6a9ec0
僵尸行走:52AFCA
486C55

獲取怪物:413108

ebx:6a9ec0 768

怪物屬性偏移:
+2C X坐標
+30 Y坐標
+C8 當前血量
+CC 最大血量
+1c 第幾行
+18 是否可見
+11C 怪物的大小

獲取植物欄:4131F0

植物屬性:
+24 當前恢復使用的值 == +28可以使用
+28 要多少恢復值才可以使用 (種植植物后,恢復+28的地址為488f7d 3個字節)
+34 物品的類型

植物欄列表:dd [[[6a9ec0]+768]+144]+28+i*50

種植植物的屬性:4130F4
+58 多久產生陽光
+24 產生什么東西
+28 會不會產生東西 (表示會吐陽光)
+18 可以看得見嗎 1表示可見
植物減血:52FCF0 4個字節

地下物品:413184
+58 物品的類型

004130D0 /$ 83EC 08?????? SUB ESP,8
004130D3 |. 55??????????? PUSH EBP
004130D4 |. 56??????????? PUSH ESI
004130D5 |. 33ED????????? XOR EBP,EBP
004130D7 |. 57??????????? PUSH EDI
004130D8 |. 8D7424 10???? LEA ESI,DWORD PTR SS:[ESP+10]
004130DC |. 8BD3????????? MOV EDX,EBX
004130DE |. 896C24 10???? MOV DWORD PTR SS:[ESP+10],EBP
004130E2 |. E8 69980000?? CALL PlantsVs.0041C950
004130E7 |. 84C0????????? TEST AL,AL
004130E9 |. 74 1D???????? JE SHORT PlantsVs.00413108
004130EB |. EB 03???????? JMP SHORT PlantsVs.004130F0
004130ED |?? 8D49 00?????? LEA ECX,DWORD PTR DS:[ECX]
004130F0 |> 8B4424 10???? /MOV EAX,DWORD PTR SS:[ESP+10]
004130F4 |. E8 470D0500?? |CALL PlantsVs.00463E40????????????????? ; 種植的植物
004130F9 |. 8D7424 10???? |LEA ESI,DWORD PTR SS:[ESP+10]
004130FD |. 8BD3????????? |MOV EDX,EBX
004130FF |. E8 4C980000?? |CALL PlantsVs.0041C950
00413104 |. 84C0????????? |TEST AL,AL
00413106 |.^ 75 E8???????? /JNZ SHORT PlantsVs.004130F0
00413108 |> 8D7424 10???? LEA ESI,DWORD PTR SS:[ESP+10]??????????? ; 取v的地址
0041310C |. 8BD3????????? MOV EDX,EBX????????????????????????????? ; 取角色對象
0041310E |. 896C24 10???? MOV DWORD PTR SS:[ESP+10],EBP??????????? ; v = 0
00413112 |. E8 D9970000?? CALL PlantsVs.0041C8F0
00413117 |. 84C0????????? TEST AL,AL?????????????????????????????? ; al != 0的

時候,表示有怪物要行動
00413119 |. 74 1D???????? JE SHORT PlantsVs.00413138
0041311B |. EB 03???????? JMP SHORT PlantsVs.00413120
0041311D |?? 8D49 00?????? LEA ECX,DWORD PTR DS:[ECX]
00413120 |> 8B4424 10???? /MOV EAX,DWORD PTR SS:[ESP+10]
00413124 |. E8 377D1100?? |CALL PlantsVs.0052AE60
00413129 |. 8D7424 10???? |LEA ESI,DWORD PTR SS:[ESP+10]
0041312D |. 8BD3????????? |MOV EDX,EBX
0041312F |. E8 BC970000?? |CALL PlantsVs.0041C8F0
00413134 |. 84C0????????? |TEST AL,AL
00413136 |.^ 75 E8???????? /JNZ SHORT PlantsVs.00413120
00413138 |> 8D7424 10???? LEA ESI,DWORD PTR SS:[ESP+10]
0041313C |. 8BD3????????? MOV EDX,EBX
0041313E |. 896C24 10???? MOV DWORD PTR SS:[ESP+10],EBP
00413142 |. E8 69980000?? CALL PlantsVs.0041C9B0
00413147 |. 84C0????????? TEST AL,AL
00413149 |. 74 1D???????? JE SHORT PlantsVs.00413168
0041314B |. EB 03???????? JMP SHORT PlantsVs.00413150
0041314D |?? 8D49 00?????? LEA ECX,DWORD PTR DS:[ECX]
00413150 |> 8B4424 10???? /MOV EAX,DWORD PTR SS:[ESP+10]
00413154 |. E8 07B30500?? |CALL PlantsVs.0046E460
00413159 |. 8D7424 10???? |LEA ESI,DWORD PTR SS:[ESP+10]
0041315D |. 8BD3????????? |MOV EDX,EBX
0041315F |. E8 4C980000?? |CALL PlantsVs.0041C9B0
00413164 |. 84C0????????? |TEST AL,AL
00413166 |.^ 75 E8???????? /JNZ SHORT PlantsVs.00413150
00413168 |> 8D7424 10???? LEA ESI,DWORD PTR SS:[ESP+10]
0041316C |. 8BD3????????? MOV EDX,EBX
0041316E |. 896C24 10???? MOV DWORD PTR SS:[ESP+10],EBP
00413172 |. E8 99980000?? CALL PlantsVs.0041CA10
00413177 |. 84C0????????? TEST AL,AL
00413179 |. 74 1D???????? JE SHORT PlantsVs.00413198
0041317B |. EB 03???????? JMP SHORT PlantsVs.00413180
0041317D |?? 8D49 00?????? LEA ECX,DWORD PTR DS:[ECX]
00413180 |> 8B4424 10???? /MOV EAX,DWORD PTR SS:[ESP+10]
00413184 |. E8 77E30100?? |CALL PlantsVs.00431500????????????????? ; 地上的物品
00413189 |. 8D7424 10???? |LEA ESI,DWORD PTR SS:[ESP+10]
0041318D |. 8BD3????????? |MOV EDX,EBX
0041318F |. E8 7C980000?? |CALL PlantsVs.0041CA10
00413194 |. 84C0????????? |TEST AL,AL
00413196 |.^ 75 E8???????? /JNZ SHORT PlantsVs.00413180
00413198 |> 8D7424 10???? LEA ESI,DWORD PTR SS:[ESP+10]
0041319C |. 8BD3????????? MOV EDX,EBX
0041319E |. 896C24 10???? MOV DWORD PTR SS:[ESP+10],EBP
004131A2 |. E8 C9980000?? CALL PlantsVs.0041CA70
004131A7 |. 84C0????????? TEST AL,AL
004131A9 |. 74 1E???????? JE SHORT PlantsVs.004131C9
004131AB |. EB 03???????? JMP SHORT PlantsVs.004131B0
004131AD |?? 8D49 00?????? LEA ECX,DWORD PTR DS:[ECX]
004131B0 |> 8B4424 10???? /MOV EAX,DWORD PTR SS:[ESP+10]
004131B4 |. 50??????????? |PUSH EAX
004131B5 |. E8 26550400?? |CALL PlantsVs.004586E0
004131BA |. 8D7424 10???? |LEA ESI,DWORD PTR SS:[ESP+10]
004131BE |. 8BD3????????? |MOV EDX,EBX
004131C0 |. E8 AB980000?? |CALL PlantsVs.0041CA70
004131C5 |. 84C0????????? |TEST AL,AL
004131C7 |.^ 75 E7???????? /JNZ SHORT PlantsVs.004131B0
004131C9 |> 8BBB 3C010000 MOV EDI,DWORD PTR DS:[EBX+13C]?????????? ; edi = 游戲

基址
004131CF |. E8 CC5B0200?? CALL PlantsVs.00438DA0
004131D4 |. 8BB3 38010000 MOV ESI,DWORD PTR DS:[EBX+138]
004131DA |. E8 A1550200?? CALL PlantsVs.00438780
004131DF |. 8B83 44010000 MOV EAX,DWORD PTR DS:[EBX+144]
004131E5 |. 33F6????????? XOR ESI,ESI
004131E7 |. 3968 24?????? CMP DWORD PTR DS:[EAX+24],EBP
004131EA |. 7E 1E???????? JLE SHORT PlantsVs.0041320A
004131EC |. 33FF????????? XOR EDI,EDI
004131EE |. 8BFF????????? MOV EDI,EDI
004131F0 |> 8D4407 28???? /LEA EAX,DWORD PTR DS:[EDI+EAX+28]
004131F4 |. E8 57400700?? |CALL PlantsVs.00487250
004131F9 |. 8B83 44010000 |MOV EAX,DWORD PTR DS:[EBX+144]
004131FF |. 83C6 01?????? |ADD ESI,1
00413202 |. 83C7 50?????? |ADD EDI,50
00413205 |. 3B70 24?????? |CMP ESI,DWORD PTR DS:[EAX+24]
00413208 |.^ 7C E6???????? /JL SHORT PlantsVs.004131F0
0041320A |> 5F??????????? POP EDI
0041320B |. 5E??????????? POP ESI
0041320C |. 5D??????????? POP EBP
0041320D |. 83C4 08?????? ADD ESP,8
00413210 /. C3??????????? RETN


00410A94 |. 52??????????? PUSH EDX???????????????????????????????? ; -1
00410A95 |. 50??????????? PUSH EAX???????????????????????????????? ; 植物類型
00410A96 |. 8B4424 20???? MOV EAX,DWORD PTR SS:[ESP+20]??????????? ; Y
00410A9A |. 57??????????? PUSH EDI???????????????????????????????? ; X
00410A9B |. 55??????????? PUSH EBP???????????????????????????????? ; 游戲基址
00410A9C |. E8 7FC6FFFF?? CALL PlantsVs.0040D120


修改器代碼:

var
Form1: TForm1;
pGameBase:Pointer;
pPlantBaseArray:array[0..100] of pointer;
pMonBaseArray:array[0..100] of pointer;
pGoodsBaseArray:array[0..100] of pointer;
?? pPlantToolBarBaseArray:array[0..100] of pointer;
type
stMonsterInfo = record
x:single;
y:single;
nMaxHP:integer;
nCurHP:integer;
nRow:integer;
fSize:single;
end;

type
stPlantToolBarInfo = record
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer;
end;

type
stGoodsInfo = record
nType:integer;
end;

type
stPlantInfo = record
bIsProdure:integer;
nType:integer;
end;

implementation

{$R *.dfm}

procedure GetGameBase();
begin
asm
??? pushad
??? mov eax, $6a9ec0
??? mov eax, [eax]
??? add eax, $768
??? mov eax, [eax]

??? mov pGameBase, eax //游戲基址
??? popad
end;
end;

function GetMonsterBase(pMonBase:Pointer):Pointer;
begin
asm
??? pushad
??? mov esi, pMonBase

??? mov edx, pGameBase//游戲基址
??? mov edi, $0041C8F0
??? call edi//獲取一個怪物地址

??? popad
end;

Result:= Pointer(pMonBase^);
end;


function GetPlantBase(pPlantBase:Pointer):Pointer;
begin
asm
??? pushad
??? mov esi, pPlantBase

??? mov edx, pGameBase//游戲基址
??? mov edi, $0041C950
??? call edi//獲取一個植物地址

??? popad
end;

Result:= Pointer(pPlantBase^);
end;

function GetGoodsBase(pGoodsBase:Pointer):Pointer;
begin
asm
??? pushad
??? mov esi, pGoodsBase

??? mov edx, pGameBase//游戲基址
??? mov edi, $0041CA10
??? call edi//獲取一個植物地址

??? popad
end;

Result:= Pointer(pGoodsBase^);
end;

function GetPlantToolbarBase(nIndex:integer):Pointer;
var
pBase:Pointer;
n:integer;

begin
n:= nIndex * $50 + $28;
asm
pushad
??? mov eax, pGameBase
??? mov eax, [eax + $144]
??? mov pBase, eax
popad
end;

pBase:= Pointer(DWORD(pBase) + n);
Result:= pBase;
end;

function GetMaxPlantNum():integer;
var
n:integer;
begin
asm
??? pushad
??? mov eax, pGameBase
??? mov eax, [eax + $144]
??? mov eax, [eax + $24]
??? mov n, eax
??? popad
end;

Result:= n;
end;

procedure FreshMonsterList();
var
pMonBase:Integer;
n, nIndex:integer;

begin
nIndex:= 0;
pMonBase:= 0;
n:= form1.RzComboBox1.ItemIndex;
form1.RzComboBox1.Clear;
repeat
??? pMonBase:= Integer(GetMonsterBase(@pMonBase));
??? if pMonBase = -1 then
??? begin
????? form1.RzComboBox1.ItemIndex:= n;
????? exit;
??? end;
??? form1.RzComboBox1.Add('怪物:' + IntToStr(nIndex + 1)) ;
??? pMonBaseArray[nIndex]:= Pointer(pMonBase);
??? nIndex:= nIndex + 1;
until(false);
form1.RzComboBox1.ItemIndex:= n;
end;

procedure FreshPlantToolBarList();
var
nMaxPlant:integer;
i:integer;
pPlantBase:Pointer;
n, nIndex:integer;

begin
n:= form1.RzComboBox2.ItemIndex;

form1.RzComboBox2.Clear;
nIndex:= 0;
nMaxPlant:= GetMaxPlantNum();
for i:= 0 to nMaxPlant - 1 do
begin
??? pPlantBase:= GetPlantToolbarBase(i);
??? pPlantToolBarBaseArray[nIndex]:= pPlantBase;
??? nIndex:= nIndex + 1;
??? form1.RzComboBox2.Add('植物欄:' + IntToStr(nIndex));
end;

form1.RzComboBox2.ItemIndex:= n;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
GetGameBase();
end;

procedure FreshPlantList();
var
pPlantBase:Integer;
n, nIndex:integer;

begin
n:= form1.RzComboBox4.ItemIndex;
form1.RzComboBox4.Clear;
nIndex:= 0;
pPlantBase:= 0;

repeat
??? pPlantBase:= Integer(GetPlantBase(@pPlantBase));
??? if pPlantBase = -1 then
??? begin
????? form1.RzComboBox4.ItemIndex:= n;
????? exit;
??? end;

??? form1.RzComboBox4.Add('植物:' + IntToStr(nIndex + 1)) ;
??? pPlantBaseArray[nIndex]:= Pointer(pPlantBase);
??? nIndex:= nIndex + 1;
until(false);
end;

procedure FreshGoodsList();
var
pGoodsBase:Integer;
cItem:TListItem;
n, nIndex:integer;

begin
n:= form1.RzComboBox3.ItemIndex;
form1.RzComboBox3.Clear;
nIndex:= 0;
pGoodsBase:= 0;

repeat
??? pGoodsBase:= Integer(GetGoodsBase(@pGoodsBase));
??? if pGoodsBase = -1 then
??? begin
????? form1.RzComboBox3.ItemIndex:= n;
????? exit;
??? end;
??? form1.RzComboBox3.Add('物品:' + IntToStr(nIndex + 1)) ;
??? pGoodsBaseArray[nIndex]:= Pointer(pGoodsBase);
??? nIndex:= nIndex + 1;
until(false);
end;

procedure TForm1.TabSheet2Show(Sender: TObject);
begin
form1.RzComboBox1.Clear;
FreshMonsterList();
if form1.RzComboBox1.Items.Count > 0 then
?? form1.RzComboBox1.ItemIndex:= 0;
end;

procedure TForm1.TabSheet5Show(Sender: TObject);
begin
FreshGoodsList();
if form1.RzComboBox3.Items.Count > 0 then
form1.RzComboBox3.ItemIndex:= 0;
end;

procedure TForm1.TabSheet4Show(Sender: TObject);
begin
FreshPlantList();
if form1.RzComboBox4.Items.Count > 0 then
form1.RzComboBox4.ItemIndex:= 0;
end;

procedure SetMonsterInfo(pMonBase:Pointer; stMonInfo:stMonsterInfo);
var
s:single;

begin
s:= stMonInfo.fSize;
asm
??? pushad
??? mov eax, pMonBase
??? mov ecx, stMonInfo.x
??? mov [eax + $2c], ecx

??? mov ecx, stMonInfo.y
??? mov [eax + $30], ecx

??? mov ecx, stMonInfo.nCurHP
??? mov [eax + $C8], ecx

??? mov ecx, stMonInfo.nMaxHP
??? mov [eax + $cc], ecx

??? mov ecx, stMonInfo.nRow
??? mov [eax + $1c], ecx

??? mov ecx, stMonInfo.fSize
??? mov [eax + $11c], ecx
??? popad
end;
end;

procedure GetMonsterInfo(pMonBase:Pointer;stMonInfo:stMonsterInfo);
var
x:single;
y:single;
nMaxHP:integer;
nCurHP:integer;
nRow:integer;
fSize:single;
begin
asm
??? pushad
??? mov eax, pMonBase
??? mov ecx, [eax + $2c]
??? mov x, ecx

??? mov ecx, [eax + $30]
??? mov y, ecx

??? mov ecx, [eax + $c8]
??? mov nCurHP, ecx

??? mov ecx, [eax + $cc]
??? mov nMaxHP, ecx

??? mov ecx, [eax + $1c]
??? mov nRow, ecx

??? mov ecx, [eax + $11c]
??? mov fSize, ecx
??? popad
end;


form1.RzEdit5.Text:= FloatToStr(x);
form1.RzEdit5.Text:= FloatToStr(x);
form1.RzEdit6.Text:= FloatToStr(y);
form1.RzEdit7.Text:= IntToStr(nMaxHP);
form1.RzEdit8.Text:= IntToStr(nCurHP);
form1.RzEdit9.Text:= IntToStr(nRow);
form1.RzEdit10.Text:= FloatToStr(fSize);
end;

procedure TForm1.RzButton4Click(Sender: TObject);
var
pMonBase:Pointer;
stInfo:stMonsterInfo;
nIndex:integer;
begin
if form1.RzComboBox1.Items.Count <= 0 then
??? exit;
nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]);

stInfo.x:= StrToFloat(form1.RzEdit5.Text);
stInfo.y:= StrToFloat(form1.RzEdit6.Text);
stInfo.nMaxHP:= StrToInt(form1.RzEdit7.Text);
stInfo.nCurHP:= StrToInt(form1.RzEdit8.Text);
stInfo.nRow:= StrToInt(form1.RzEdit9.Text);
stInfo.fSize:= StrToFloat(form1.RzEdit10.Text);

nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]);
SetMonsterInfo(pMonBase, stInfo);

end;

procedure TForm1.RzComboBox1Change(Sender: TObject);
var
stInfo:stMonsterInfo;
pMonBase:pointer;
nIndex:integer;

begin
?? if form1.RzComboBox1.Items.Count <= 0 then
??? exit;
nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]);
GetMonsterInfo(pMonBase, stInfo);

end;

procedure TForm1.RzComboBox1CloseUp(Sender: TObject);
begin
FreshMonsterList();
end;

procedure SetGoodsInfo(pGoodsBase:Pointer; stInfo:stGoodsInfo);
var
nType:integer;

begin
nType:= stInfo.nType;
asm
??? pushad
??? mov eax, pGoodsBase

??? mov ecx, nType
??? mov [eax + $58], ecx
??? popad
end;
end;

procedure GetGoodsInfo(pGoodsBase:Pointer; var stInfo:stGoodsInfo);
var
nType:integer;

begin
asm
??? pushad
??? mov eax, pGoodsBase
??? mov ecx, [eax + $58]
??? mov nType, ecx
??? popad
end;

?? form1.RzEdit4.Text:= IntToStr(nType);
end;

procedure TForm1.TabSheet3Show(Sender: TObject);
begin
FreshPlantToolBarList();
if form1.RzComboBox2.Items.Count > 0 then
??? form1.RzComboBox2.ItemIndex:= 0;
end;

procedure TForm1.RzComboBox3Change(Sender: TObject);
var
stInfo:stGoodsInfo;
pGoodsBase:pointer;
nIndex:integer;

begin
?? if form1.RzComboBox3.Items.Count <= 0 then
??? exit;
nIndex:= form1.RzComboBox3.ItemIndex;
FreshGoodsList();
pGoodsBase:= Pointer(pGoodsBaseArray[nIndex]);
GetGoodsInfo(pGoodsBase, stInfo);
end;

procedure TForm1.RzButton3Click(Sender: TObject);
var
stInfo:stGoodsInfo;
nIndex:integer;
pGoodsBase:Pointer;

begin
??? if (form1.RzComboBox3.Items.Count <= 0) and (StrToInt(form1.RzEdit4.Text) <=

15) then
??? exit;

nIndex:= form1.RzComboBox3.ItemIndex;
FreshGoodsList();
pGoodsBase:= Pointer(pGoodsBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.nType:= StrToInt(form1.RzEdit4.Text);
SetGoodsInfo(pGoodsBase, stInfo);
end;

procedure GetPlantInfo(pPlantBase:Pointer; var stInfo:stPlantInfo);
var
bIsProdure:integer;
nType:integer;

begin
asm
??? pushad
??? mov eax, pPlantBase
??? mov ecx, [eax + $28]
??? mov bIsProdure, ecx

??? mov ecx, [eax + $24]
??? mov nType, ecx
??? popad
end;

?? form1.RzEdit3.Text:= IntToStr(bIsProdure);
?? form1.RzEdit2.Text:= IntToStr(nType);
end;

procedure SetPlantInfo(pPlantBase:Pointer; stInfo:stPlantInfo);
var
bIsProdure:integer;
nType:integer;

begin
bIsProdure:= stInfo.bIsProdure;
nType:= stInfo.nType;
asm
??? pushad
??? mov eax, pPlantBase
??? mov ecx, bIsProdure
??? mov [eax + $24], ecx

??? mov ecx, nType
??? mov [eax + $28], ecx
??? popad
end;
end;

procedure TForm1.RzComboBox4Change(Sender: TObject);
var
stInfo:stPlantInfo;
pPlantBase:pointer;
nIndex:integer;

begin
if form1.RzComboBox4.Items.Count <= 0 then
??? exit;
nIndex:= form1.RzComboBox4.ItemIndex;
FreshPlantList();
pPlantBase:= Pointer(pPlantBaseArray[nIndex]);
GetPlantInfo(pPlantBase, stInfo);
end;

procedure TForm1.RzButton2Click(Sender: TObject);
var
stInfo:stPlantInfo;
nIndex:integer;
pPlantBase:Pointer;

begin
if (MessageBox(form1.Handle, '該功能可能會引起不良效果,請確定要不要使用?使用前請

先保存游戲!!', '提示', Windows.MB_ICONWARNING or MB_YESNO) = IDNO) then
??? exit;

if (form1.RzComboBox4.Items.Count <= 0) then
??? exit;

nIndex:= form1.RzComboBox4.ItemIndex;
FreshPlantList();
pPlantBase:= Pointer(pPlantBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.bIsProdure:= StrToInt(form1.RzEdit3.Text);
stInfo.nType:= StrToInt(form1.RzEdit2.Text);
SetPlantInfo(pPlantBase, stInfo);
end;

procedure TForm1.RzComboBox4CloseUp(Sender: TObject);
begin
FreshPlantList();
end;

procedure GetPlantToolBarInfo(pPlantBase:Pointer; var

stInfo:stPlantToolBarInfo);
var
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer;

begin
asm
??? pushad
??? mov eax, pPlantBase
??? mov ecx, [eax + $34]
??? mov nType, ecx

??? mov ecx, [eax + $24]
??? mov nCurRecovery, ecx

??? mov ecx, [eax + $28]
??? mov nMaxRecovery, ecx

??? popad
end;

?? form1.RzEdit1.Text:= IntToStr(nType);
?? form1.RzEdit11.Text:= IntToStr(nCurRecovery);
?? form1.RzEdit12.Text:= IntToStr(nMaxRecovery);
end;

procedure SetPlantToolBarInfo(pPlantBase:Pointer; var

stInfo:stPlantToolBarInfo);
var
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer;
begin
nType:= stInfo.nType;
?? nMaxRecovery:= stInfo.nMaxRecovery;
nCurRecovery:= stInfo.nCurRecovery;
asm
??? pushad
??? mov eax, pPlantBase
??? mov ecx, nType
??? mov [eax + $34], ecx

??? mov ecx, nMaxRecovery
??? mov [eax + $28], ecx

??? mov ecx, nCurRecovery
??? mov [eax + $24], ecx
??? popad
end;
end;


procedure TForm1.RzComboBox2Change(Sender: TObject);
var
stInfo:stPlantToolBarInfo;
pPlantToolBarBase:pointer;
nIndex:integer;

begin
if form1.RzComboBox2.Items.Count <= 0 then
??? exit;
nIndex:= form1.RzComboBox2.ItemIndex;
FreshPlantToolBarList();
pPlantToolBarBase:= Pointer(pPlantToolBarBaseArray[nIndex]);
GetPlantToolBarInfo(pPlantToolBarBase, stInfo);
end;

procedure TForm1.RzButton1Click(Sender: TObject);
var
stInfo:stPlantToolBarInfo;
nIndex:integer;
pPlantToolBarBase:Pointer;

begin
if (form1.RzComboBox2.Items.Count <= 0) then
??? exit;

nIndex:= form1.RzComboBox2.ItemIndex;
FreshPlantToolBarList();
pPlantToolBarBase:= Pointer(pPlantToolBarBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.nType:= StrToInt(form1.RzEdit1.Text);
stInfo.nMaxRecovery:= StrToInt(form1.RzEdit12.Text);
stInfo.nCurRecovery:= StrToInt(form1.RzEdit11.Text);
SetPlantToolBarInfo(pPlantToolBarBase, stInfo);
end;

procedure TForm1.RzButton6Click(Sender: TObject);
var
nPlantToolBarNum:integer;

begin
asm
??? pushad
??? mov eax, pGameBase
??? mov eax, [eax + $144]
??? add eax, $24

??? mov ecx, 9
??? mov [eax], ecx
??? popad
end
end;

procedure TForm1.RzButton5Click(Sender: TObject);
begin
asm
pushad
mov eax, pGameBase
add eax, $5560
mov [eax], 9999999
popad
end;
end;

procedure TForm1.RzComboBox3CloseUp(Sender: TObject);
begin
FreshGoodsList();
end;

procedure TForm1.RzComboBox2CloseUp(Sender: TObject);
begin
FreshPlantToolBarList();
end;

function WriteMemory(szProcName:PChar; pAddr:Pointer; szBuf:array of char;

dwSize:DWORD):boolean;
var
hGameWnd:HWND;
dwID:DWORD;
hProc:THandle;
dwWriteByte:DWORD;

begin
hGameWnd:= FindWindow(nil, szProcName);
GetWindowThreadProcessId(hGameWnd, dwID);
hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
if hProc = 0 then
??? begin
??? Result:= false;
??? exit;
??? end;

WriteProcessMemory(hProc, pAddr, @szBuf, dwSize, dwWriteByte);
CloseHandle(hProc);

Result:= true;
end;

procedure ModiryPlantToolBar();
var
nMaxPlant:integer;
i:integer;
pPlantBase:Pointer;
n, nIndex:integer;

begin
nIndex:= 0;
nMaxPlant:= GetMaxPlantNum();
for i:= 0 to nMaxPlant - 1 do
begin
??? pPlantBase:= GetPlantToolbarBase(i);
??? asm
????? pushad
????? mov eax, pPlantBase
????? mov [eax + $28], 0
????? popad
??? end;
??? nIndex:= nIndex + 1;
end;
end;

procedure TForm1.RzButton7Click(Sender: TObject);
var
szBuf:array[0..2] of char;

begin
szBuf[0]:= Char($90);
szBuf[1]:= Char($90);
szBuf[2]:= Char($90);
WriteMemory('植物大戰僵尸中文版', Pointer($488f7d), szBuf, 3);
ModiryPlantToolBar();

asm
pushad
mov eax, pGameBase
add eax, $5560
mov [eax], 9999999
popad
end;
end;

procedure GrowPlant(x,y,nType:integer);
begin
asm
??? pushad
??? mov eax, y
??? push -1
??? push nType
??? push x
??? push pGameBase
??? mov edi, $0040D120
??? call edi
??? popad
end;
end;
procedure TForm1.RzButton8Click(Sender: TObject);
var
x,y:integer;
nType:integer;
n:integer;

begin
randomize;
nType:= 0;
n:= 0;
for x:= 0 to 8 do
begin
??? for y:= 0 to 5 do
??? begin
??? if RzComboBox5.ItemIndex = 0 then
????? nType:= math.RandomRange(0, 48)
??? else if RzComboBox5.ItemIndex = 1 then
??? begin
????? nType:= n;
????? n:= n + 1;
????? if n = 48 then
????? n:= 0;
??? end
??? else
????? nType:= RzComboBox5.ItemIndex - 2;

????? GrowPlant(x, y, nType);
??? end;
end;
end;

procedure TForm1.TabSheet1Show(Sender: TObject);
var
i:integer;
begin
RzComboBox5.Add('隨機種植');
RzComboBox5.Add('順序種植');

for i:= 1 to 48 do
??? RzComboBox5.Add(IntToStr(i));
???
??? RzComboBox5.ItemIndex:= 0;
end;

procedure TForm1.TabSheet1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
GetGameBase();
end;

procedure TForm1.RzButton9Click(Sender: TObject);
var
szBuf:array[0..3] of char;

begin
szBuf[0]:= Char($90);
szBuf[1]:= Char($90);
szBuf[2]:= Char($90);
szBuf[3]:= Char($90);

WriteMemory('植物大戰僵尸中文版', Pointer($52FCF0), szBuf, 4);
end;

procedure KillAllMonster();
var
pMonBase:Integer;
n, nIndex:integer;
stInfo:stMonsterInfo;
begin
nIndex:= 0;
pMonBase:= 0;
repeat
??? pMonBase:= Integer(GetMonsterBase(@pMonBase));
??? if pMonBase = -1 then
??? begin
????? exit;
??? end;
??? asm
??? pushad
??? mov eax, pMonBase
??? mov [eax + $c8], -1
??? popad
??? end;
until(false);
end;

procedure TForm1.RzButton10Click(Sender: TObject);
begin
ShowMessage('由于種種原因,怪物需要再K它一下,O(∩_∩)O哈哈~');
KillAllMonster();
end;

end.
?

?

總結

以上是生活随笔為你收集整理的植物大战僵尸源代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。