Here's the entire A1Q1 recoded into C ...
Code: Select all
// Quest.cpp : Sample mod dll for use with D2Mod.dll mod system
// Author: SVR 2004
//
//=======================================================================
#include <d2mod.h> // main include for all import definitions/library functions
#include "Quest.h" // add your header here
void A1Q1Init(Quest *pQuest);
//=======================================================================
// mod data - put needed global data here
QuestInit A1Q1= {A1Q1Init,0,0x64,0,1,1}; // Act1-Quest1 Init table entry
NPCMenu sNPCInfoA1Q1[8] = {
{
{0x94,0x40,0x00},
1
},
{
{0x94,0x41,0x02,
0x9B,0x46,0x02,
0x93,0x45,0x02,
0x96,0x42,0x02,
0x9A,0x43,0x02},
5
},
{
{0x96,0x48,0x02,
0x9B,0x4B,0x02,
0x9A,0x49,0x02,
0x94,0x47,0x02,
0x93,0x4A,0x02},
5
},
{
{0x96,0x4D,0x02,
0x9B,0x50,0x02,
0x9A,0x4E,0x02,
0x94,0x4C,0x02,
0x93,0x4F,0x02},
5
},
{
{0x9B,0x50,0x02,
0x9A,0x4E,0x02,
0x93,0x4F,0x02},
3
},
{
{-1,0,0x02},
0
},
{
{-1,0,0x02},
0
},
{
{-1,0,0x02},
0
}
};
DWORD msgTbl[]= {-1,0,1,2,3,4}; // Act1-Quest1 state message table (index's NPCInfo table)
//=========================================
// fog exports
FUNC(const void*, FASTCALL ,D2Malloc,(DWORD,DWORD,char *,DWORD,DWORD),(DWORD)&Fog_10045);
/*
inline void* D2Malloc(DWORD heap,DWORD size,char *file, DWORD line)
{
void* tmpRet;
__asm {
push line
push file
mov edx,size
mov ecx,heap
call DWORD PTR [Fog_10045]
mov [tmpRet],eax
}
return tmpRet;
}
*/
//=========================================
// d2common exports
FUNC(int, STDCALL, GetActFromLevel,(int),(DWORD)&D2Common_10001);
FUNC(DWORD , STDCALL, GetRoomsSeen,(Act* ptAct,DWORD eLevelID),(DWORD)&D2Common_10090);
FUNC(DWORD , STDCALL, GetBit,(DWORD* pHist,DWORD index,DWORD bit),(DWORD)&D2Common_11107);
FUNC(DWORD , STDCALL, SetBit,(DWORD* pHist,DWORD index,DWORD bit),(DWORD)&D2Common_11108);
FUNC(DWORD , STDCALL, ClearBit,(DWORD* pHist,DWORD index,DWORD bit),(DWORD)&D2Common_11109);
FUNC(DWORD , STDCALL, UpdateHist,(DWORD* pHist,DWORD index),(DWORD)&D2Common_11110); // ??
FUNC(PlayerData*, STDCALL, GetPlayerData,(Unit* pPlayer),(DWORD)&D2Common_10424);
//=========================================
// local d2game functions - used by all quests
FUNC(Quest* , FASTCALL, GetQuestInfo ,(D2Game* ptGame,DWORD questID),(DWORD)(D2GameBase+0x0063B90));
FUNC(DWORD , FASTCALL, QuestFindPlayer ,(Quest* pQuest,DWORD playerID),(DWORD)(D2GameBase+0x00668B0));
FUNC(void , FASTCALL, QuestRemovePlayer,(Quest* pQuest, QParam* pqParam),(DWORD)(D2GameBase+0x00668F0));
FUNC(void , FASTCALL, AllRemovePlayer,(void* pPlayers, DWORD playerID),(DWORD)(D2GameBase+0x0066840));
FUNC(DWORD , FASTCALL, SetGameState ,(Quest* pQuest,DWORD state,void *file,DWORD line),(DWORD)(D2GameBase+0x0064CF0));
FUNC(DWORD , FASTCALL, Notify ,(D2Game* ptGame,char* msg,void *file,DWORD line),(DWORD)(D2GameBase+0x0064A30));
FUNC(DWORD , FASTCALL, IterateFn1 ,(D2Game* ptGame,DWORD unk1,DWORD unk2,void *pfnIterate),(DWORD)(D2GameBase+0x008CC40));
FUNC(DWORD , FASTCALL, IterateFn2 ,(Quest* pQuest,DWORD unk1,DWORD unk2,void *pfnIterate,DWORD unk3),(DWORD)(D2GameBase+0x0064CA0));
FUNC(DWORD , FASTCALL, IterateFn3 ,(Quest* pQuest,void *pfnIterate,DWORD unk),(DWORD)(D2GameBase+0x0064690));
FUNC(DWORD , FASTCALL, DisplayNPCMsg ,(D2Game* ptGame,Unit* ptPlayer,Unit* pNpcUnit),(DWORD)(D2GameBase+0x0066F10));
FUNC(void , FASTCALL, PostNPCMsg ,(Quest* pQuest,TextHead* pTextHead,DWORD npcID,DWORD msgID),(DWORD)(D2GameBase+0x0063D60));
FUNC(DWORD , FASTCALL, QDataFindPlayer ,(Quest1Data* pQData,DWORD playerID),(DWORD)(D2GameBase+0x0066880));
FUNC(DWORD , FASTCALL, QDataAddPlayer ,(Quest1Data* pQData,DWORD playerID),(DWORD)(D2GameBase+0x0066810));
FUNC(DWORD , FASTCALL, D2Game_X656C0 ,(D2Game* ptGame,DWORD eFilter,DWORD value),(DWORD)(D2GameBase+0x00656C0));
FUNC(DWORD , FASTCALL, D2Game_X66D60 ,(D2Game* ptGame,Quest1Data* pQData,DWORD eFilter,DWORD value),(DWORD)(D2GameBase+0x0066D60));
FUNC(DWORD , FASTCALL, D2Game_X66E80 ,(D2Game* ptGame,DWORD value),(DWORD)(D2GameBase+0x0066E80));
//=========================================
// this are quest specific
// DWORD *msgTbl=(DWORD *)(D2GameBase+0x102558);
void *pfnIterate1=(void *)(D2GameBase+0x0067D30);
void *pfnIterate2=(void *)(D2GameBase+0x0067B30);
void *pfn_X68160=(void *)(D2GameBase+0x0068160);
void *pfn_X680C0=(void *)(D2GameBase+0x00680C0);
void *pfn_X68120=(void *)(D2GameBase+0x0068120);
void *pfn_X681B0=(void *)(D2GameBase+0x00681B0);
// NPCInfo *A1Q1Msg=(NPCInfo *)sNPCInfoA1Q1; //(D2GameBase+0x0101F38);
QuestInit* sgptQuestInit=(QuestInit*)(D2GameBase+0x0101278);
//=======================================================================
// mod functions - put functions to call from edits here
Quest Quests[100];
static int Depth=-1;
void EventFunc(Quest *pQuest,QParam *pqParam)
{
DWORD event=pqParam->eCallback;
Quest *pTmp=&Quests[pQuest->QuestID];
Depth++;
if(memcmp( pTmp,pQuest,0xA0))
{
char s[1000];
char s1[100];
DWORD *p1=(DWORD *)pQuest;
DWORD *p2=(DWORD *)pTmp;
lstrcpyn(s,"\n ",Depth*4+3);
lstrcat(s,"Data Changed before :");
for(int i=0;i<(0xA0>>2);i++)
{
if(*p1!=*p2)
{
wsprintf(s1,"+%02x = %08X was %08X ",i*4,*p1,*p2);
lstrcat(s,s1);
}
p1++;p2++;
}
if(pQuest->eFilter != pTmp->eFilter )
{
wsprintf(s1," !!! eFilter = %08X was %08X ",i*4,pQuest->eFilter ,pTmp->eFilter );
lstrcat(s,s1);
}
log_info(s);
memmove(pTmp,pQuest,0xA0);
}
log_message("%*sQuest %02x -> +%02Xh(%2d) Called",Depth*4," ",
pQuest->QuestID,event*4+0xA0,pqParam->eCallback);
pTmp->pCallback[event](pQuest,pqParam);
if(memcmp( pTmp,pQuest,0xA0))
{
char s[1000];
char s1[100];
DWORD *p1=(DWORD *)pQuest;
DWORD *p2=(DWORD *)pTmp;
lstrcpyn(s," ",Depth*4+2);
lstrcat(s,"Data Changed after :");
for(int i=0;i<(0xA0>>2);i++)
{
if(*p1!=*p2)
{
wsprintf(s1,"+%02x = %08X was %08X ",i*4,*p1,*p2);
lstrcat(s,s1);
}
p1++;p2++;
}
if(pQuest->eFilter != pTmp->eFilter )
{
wsprintf(s1," !!! eFilter = %08X was %08X ",i*4,pQuest->eFilter ,pTmp->eFilter );
lstrcat(s,s1);
}
log_info(s);
memmove(pTmp,pQuest,0xA0);
}
Depth--;
}
//=================================================================================
// Quest1 functions
//=================================================================================
#define QUEST1_NPC 0x94
#define QUEST1_LEVEL 8
//=================================================================================
// Quest1 pActiveFilter function
/*
6FC979A0 . 56 PUSH ESI ; Quest 1 pActiveFilter (+E8)
6FC979A1 . 81FA 94000000 CMP EDX,94 << NPC ID
6FC979A7 . 57 PUSH EDI
6FC979A8 . 8BF1 MOV ESI,ECX
6FC979AA . 75 59 JNZ SHORT D2Game.6FC97A05
6FC979AC . 8B86 E0000000 MOV EAX,[ESI+E0]
6FC979B2 . 8B7C24 10 MOV EDI,[ESP+10]
6FC979B6 . 6A 00 PUSH 0
6FC979B8 . 50 PUSH EAX
6FC979B9 . 57 PUSH EDI
6FC979BA . E8 553F0800 CALL <JMP.&D2Common.#11107> ; if(GetBit(0))
6FC979BF . 83F8 01 CMP EAX,1 ; return 0
6FC979C2 . 74 41 JE SHORT D2Game.6FC97A05
6FC979C4 . 807E 09 01 CMP BYTE PTR [ESI+9],1 ; if(pQuest->bUnk09==1 && pQuest->bUnk0C==1)
6FC979C8 . 75 20 JNZ SHORT D2Game.6FC979EA ; {
6FC979CA . 807E 0C 01 CMP BYTE PTR [ESI+C],1
6FC979CE . 75 1A JNZ SHORT D2Game.6FC979EA
6FC979D0 . 8B8E E0000000 MOV ECX,[ESI+E0] ; pQuest->eFilter
6FC979D6 . 6A 01 PUSH 1
6FC979D8 . 51 PUSH ECX
6FC979D9 . 57 PUSH EDI ; // *** test not needed, can only return 1 below if test fails here
6FC979DA . E8 353F0800 CALL <JMP.&D2Common.#11107> ; if(!GetBit(1))
6FC979DF . 85C0 TEST EAX,EAX
6FC979E1 . 75 07 JNZ SHORT D2Game.6FC979EA
6FC979E3 . 5F POP EDI
6FC979E4 . B0 01 MOV AL,1 ; return 1;
6FC979E6 . 5E POP ESI
6FC979E7 . C2 0C00 RETN 0C
6FC979EA > 8B96 E0000000 MOV EDX,[ESI+E0] ; }
6FC979F0 . 6A 01 PUSH 1
6FC979F2 . 52 PUSH EDX
6FC979F3 . 57 PUSH EDI
6FC979F4 . E8 1B3F0800 CALL <JMP.&D2Common.#11107> ; if(GetBit(1))
6FC979F9 . 83F8 01 CMP EAX,1
6FC979FC . 75 07 JNZ SHORT D2Game.6FC97A05
6FC979FE . 5F POP EDI
6FC979FF . 8AC0 MOV AL,AL ; return 1
6FC97A01 . 5E POP ESI
6FC97A02 . C2 0C00 RETN 0C
6FC97A05 > 5F POP EDI ; return 0;
6FC97A06 . 32C0 XOR AL,AL
6FC97A08 . 5E POP ESI
6FC97A09 . C2 0C00 RETN 0C
*/
DWORD FASTCALL ActiveFilter(Quest *pQuest,DWORD NpcID,Unit* ptPlayer,DWORD *pHist,Unit* ptNPCUnit)
{
if(NpcID!=QUEST1_NPC)
return 0;
if(GetBit(pHist,pQuest->eFilter,0))
return 0;
if(pQuest->bUnk09==1 && pQuest->bState==1)
return 1;
return (GetBit(pHist,pQuest->eFilter,1));
}
//=========================================================================
// Quest 1 - pSequenceFilter (+EC)
/*
6FC98330 . 56 PUSH ESI
6FC98331 . 8BF1 MOV ESI,ECX
6FC98333 . 57 PUSH EDI
6FC98334 . 807E 0C 05 CMP BYTE PTR [ESI+C],5 ; State 5 ?
6FC98338 . 74 0C JE SHORT D2Game.6FC98346
6FC9833A . 8A46 09 MOV AL,[ESI+9] ; pQuestInfo->bUnk09 (disabled ?)
6FC9833D . 84C0 TEST AL,AL
6FC9833F . 74 05 JE SHORT D2Game.6FC98346
6FC98341 . 5F POP EDI
6FC98342 . B0 01 MOV AL,1
6FC98344 . 5E POP ESI
6FC98345 . C3 RETN
6FC98346 > 8B56 10 MOV EDX,[ESI+10] ; pQuestInfo->nID
6FC98349 . 8B4E 04 MOV ECX,[ESI+4] ; ptGame
6FC9834C . E8 3FB8FFFF CALL <D2Game.GetQuestInfo>
6FC98351 . 8BF8 MOV EDI,EAX
6FC98353 . 85FF TEST EDI,EDI
6FC98355 . 74 3A JE SHORT D2Game.6FC98391
6FC98357 . 8B86 EC000000 MOV EAX,[ESI+EC] ; pQuestInfo->pSequence
6FC9835D . 50 PUSH EAX ; /CodeAddress
6FC9835E . FF15 107CD26F CALL [<&KERNEL32.IsBadCodePtr>] ; \IsBadCodePtr
6FC98364 . 85C0 TEST EAX,EAX
6FC98366 . 74 1E JE SHORT D2Game.6FC98386 ; ??? check badPtr on this function addy :P stupid !
6FC98368 . 68 83020000 PUSH 283
6FC9836D . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC98372 . 68 0C19D36F PUSH D2Game.6FD3190C ; ASCII "pQuestInfo->pSequence"
6FC98377 . E8 72430800 CALL <JMP.&Fog.#10023>
6FC9837C . 83C4 0C ADD ESP,0C
6FC9837F . 6A FF PUSH -1
6FC98381 . E8 67440800 CALL D2Game.6FD1C7ED
6FC98386 > 8BCF MOV ECX,EDI
6FC98388 . FF97 EC000000 CALL [EDI+EC] ; pQuestInfo->pSequence (next quest)
6FC9838E . 5F POP EDI
6FC9838F . 5E POP ESI
6FC98390 . C3 RETN
6FC98391 > 5F POP EDI
6FC98392 . 32C0 XOR AL,AL
6FC98394 . 5E POP ESI
6FC98395 . C3 RETN
*/
DWORD FASTCALL SequenceFilter(Quest *pQuest)
{
if(pQuest->bUnk09!=0 && pQuest->bState!=5)
return 1;
Quest* pNext=GetQuestInfo(pQuest->ptGame,pQuest->nID);
if(pNext)
return pNext->pSequence(pNext);
return 0;
}
//=========================================================================
// Quest 1 - pCallback[13] (+D4)
/*
6FC983A0 . 8B42 0C MOV EAX,[EDX+C] ; Quest 1 CB 13 (+D4)
6FC983A3 . 56 PUSH ESI
6FC983A4 . 57 PUSH EDI
6FC983A5 . 8B3A MOV EDI,[EDX] ; ptGame
6FC983A7 . 50 PUSH EAX ; ptPlayerUnit
6FC983A8 . 8BF1 MOV ESI,ECX ; pQuest
6FC983AA . E8 47320800 CALL <JMP.&D2Common.#10424> ; GetPlayerData(pPlayer);
6FC983AF . 8B96 E0000000 MOV EDX,[ESI+E0] ; pQuest->eFilter - pHistory index
6FC983B5 . 33C9 XOR ECX,ECX
6FC983B7 . 8A4F 6D MOV CL,[EDI+6D] ; ptGame->Diff
6FC983BA . 6A 00 PUSH 0
6FC983BC . 52 PUSH EDX
6FC983BD . 8B7C88 10 MOV EDI,[EAX+ECX*4+10] ; pPlayerData->pQuestHistory[diff]
6FC983C1 . 57 PUSH EDI
6FC983C2 . E8 4D350800 CALL <JMP.&D2Common.#11107>
6FC983C7 . 85C0 TEST EAX,EAX ; if(GetBit(0))
6FC983C9 . 75 5C JNZ SHORT D2Game.6FC98427 ; return
6FC983CB . 8B86 E0000000 MOV EAX,[ESI+E0]
6FC983D1 . 6A 0F PUSH 0F
6FC983D3 . 50 PUSH EAX
6FC983D4 . 57 PUSH EDI
6FC983D5 . E8 3A350800 CALL <JMP.&D2Common.#11107>
6FC983DA . 85C0 TEST EAX,EAX ; if(GetBit(0Fh))
6FC983DC . 75 49 JNZ SHORT D2Game.6FC98427 ; return
6FC983DE . 6A 04 PUSH 4
6FC983E0 . 6A 01 PUSH 1 ; // hardcoded pHistory index 1 :(
6FC983E2 . 57 PUSH EDI
6FC983E3 . E8 2C350800 CALL <JMP.&D2Common.#11107>
6FC983E8 . 83F8 01 CMP EAX,1 ; if (GetBit(4))
6FC983EB . 75 0B JNZ SHORT D2Game.6FC983F8 ; {
6FC983ED . C646 0B 02 MOV BYTE PTR [ESI+B],2 ; pQuest->bUnk0B=2
6FC983F1 . C646 0C 03 MOV BYTE PTR [ESI+C],3 ; pQuest->bState=3
6FC983F5 . 5F POP EDI
6FC983F6 . 5E POP ESI ; return
6FC983F7 . C3 RETN ; }
6FC983F8 > 6A 03 PUSH 3
6FC983FA . 6A 01 PUSH 1 ; // hardcoded pHistory index 1 :(
6FC983FC . 57 PUSH EDI
6FC983FD . E8 12350800 CALL <JMP.&D2Common.#11107>
6FC98402 . 83F8 01 CMP EAX,1 ; if(GetBit(3))
6FC98405 . 75 0A JNZ SHORT D2Game.6FC98411 ; {
6FC98407 . C646 0C 03 MOV BYTE PTR [ESI+C],3 ; pQuest->bState=3
6FC9840B . 8846 0B MOV [ESI+B],AL ; pQuest->bUnk0B=1
6FC9840E . 5F POP EDI
6FC9840F . 5E POP ESI ; return
6FC98410 . C3 RETN ; }
6FC98411 > 6A 02 PUSH 2
6FC98413 . 6A 01 PUSH 1 ; // hardcoded pHistory index 1 :(
6FC98415 . 57 PUSH EDI
6FC98416 . E8 F9340800 CALL <JMP.&D2Common.#11107>
6FC9841B . 83F8 01 CMP EAX,1 ; if(GetBit(2))
6FC9841E . 75 07 JNZ SHORT D2Game.6FC98427 ; {
6FC98420 . C646 0C 02 MOV BYTE PTR [ESI+C],2 ; pQuest->bState=2
6FC98424 . 8846 0B MOV [ESI+B],AL ; pQuest->bUnk0B=1
6FC98427 > 5F POP EDI ; }
6FC98428 . 5E POP ESI ; return
6FC98429 . C3 RETN
*/
void FASTCALL Q1D4(Quest *pQuest,QParam *pqParam) //Game Started
{
D2Game* ptGame = pqParam->ptGame;
Unit *ptPlayer= pqParam->ptPlayer;
PlayerData* ptPlayerData=GetPlayerData(ptPlayer);
DWORD diff=ptGame->Difficulty;
DWORD *pHist=(DWORD *)ptPlayerData->ptQuest[diff];
if(GetBit(pHist,pQuest->eFilter,0))
return ;
if(GetBit(pHist,pQuest->eFilter,0x0F))
return ;
if(GetBit(pHist,1,4))
{
pQuest->bUnk0B=2;
pQuest->bState=3;
return ;
}
if(GetBit(pHist,1,3))
{
pQuest->bUnk0B=1;
pQuest->bState=3;
return ;
}
if(GetBit(pHist,1,2))
{
pQuest->bUnk0B=1;
pQuest->bState=2;
return ;
}
}
//=========================================================================
// Quest 1 - pCallback[0] (+A0)
/*
6FC97DC0 . 83EC 08 SUB ESP,8 ; Quest 1 function 0 (+A0) // NPC Selected
6FC97DC3 . 53 PUSH EBX
6FC97DC4 . 8BDA MOV EBX,EDX
6FC97DC6 . 55 PUSH EBP
6FC97DC7 . 56 PUSH ESI
6FC97DC8 . 8B43 0C MOV EAX,[EBX+C] ; ptPlayer
6FC97DCB . 8BF1 MOV ESI,ECX
6FC97DCD . 57 PUSH EDI
6FC97DCE . 50 PUSH EAX
6FC97DCF . 8B7E 04 MOV EDI,[ESI+4]
6FC97DD2 . E8 1F380800 CALL <JMP.&D2Common.#10424> ; getPlayerData
6FC97DD7 . 8B96 E0000000 MOV EDX,[ESI+E0] ; pQuest->eFilter
6FC97DDD . 33C9 XOR ECX,ECX
6FC97DDF . 8A4F 6D MOV CL,[EDI+6D]
6FC97DE2 . 6A 00 PUSH 0 ; check bit 0
6FC97DE4 . 52 PUSH EDX
6FC97DE5 . 8B7C88 10 MOV EDI,[EAX+ECX*4+10] ; playerData->pHistory(diff)
6FC97DE9 . 57 PUSH EDI
6FC97DEA . E8 253B0800 CALL <JMP.&D2Common.#11107>
6FC97DEF . 8BE8 MOV EBP,EAX
6FC97DF1 . 8B86 E0000000 MOV EAX,[ESI+E0]
6FC97DF7 . 6A 0D PUSH 0D ; check bit Dh
6FC97DF9 . 50 PUSH EAX
6FC97DFA . 57 PUSH EDI
6FC97DFB . E8 143B0800 CALL <JMP.&D2Common.#11107>
6FC97E00 . 894424 14 MOV [ESP+14],EAX
6FC97E04 . 8B43 08 MOV EAX,[EBX+8] ; pqParam->pNPCUnit
6FC97E07 . 85C0 TEST EAX,EAX
6FC97E09 . 75 0A JNZ SHORT D2Game.6FC97E15
6FC97E0B . C74424 10 FFFF>MOV DWORD PTR [ESP+10],-1
6FC97E13 . EB 07 JMP SHORT D2Game.6FC97E1C
6FC97E15 > 8B48 04 MOV ECX,[EAX+4] ; npcID
6FC97E18 . 894C24 10 MOV [ESP+10],ECX
6FC97E1C > 8B96 E0000000 MOV EDX,[ESI+E0]
6FC97E22 . 6A 01 PUSH 1 ; bit1
6FC97E24 . 52 PUSH EDX ; eFilter
6FC97E25 . 57 PUSH EDI ; pHistory
6FC97E26 . E8 E93A0800 CALL <JMP.&D2Common.#11107>
6FC97E2B . 85C0 TEST EAX,EAX
6FC97E2D . 74 19 JE SHORT D2Game.6FC97E48 ; if(GetBit(1)
6FC97E2F . 8B4424 10 MOV EAX,[ESP+10] ; {
6FC97E33 . 8B53 14 MOV EDX,[EBX+14]
6FC97E36 . 6A 03 PUSH 3
6FC97E38 . 50 PUSH EAX
6FC97E39 . 8BCE MOV ECX,ESI
6FC97E3B . E8 20BFFFFF CALL D2Game.6FC93D60 ; PostNpcMsg(pQuest,pqParam->14h,npcID,3)
6FC97E40 . 5F POP EDI
6FC97E41 . 5E POP ESI
6FC97E42 . 5D POP EBP
6FC97E43 . 5B POP EBX
6FC97E44 . 83C4 08 ADD ESP,8
6FC97E47 . C3 RETN ; }
6FC97E48 > 8B43 0C MOV EAX,[EBX+C] ; pqParam->ptPlayer
6FC97E4B . 85C0 TEST EAX,EAX
6FC97E4D . 75 05 JNZ SHORT D2Game.6FC97E54
6FC97E4F . 83C8 FF OR EAX,FFFFFFFF
6FC97E52 . EB 03 JMP SHORT D2Game.6FC97E57
6FC97E54 > 8B40 0C MOV EAX,[EAX+C] ; ptPlayer->PlayerID
6FC97E57 > 8BD0 MOV EDX,EAX
6FC97E59 . 8BCE MOV ECX,ESI ; pQuest
6FC97E5B . E8 50EAFFFF CALL D2Game.6FC968B0 ; if(playerID in pQuest->1C[])
6FC97E60 . 83F8 01 CMP EAX,1 ; {
6FC97E63 . 75 19 JNZ SHORT D2Game.6FC97E7E
6FC97E65 . 8B4C24 10 MOV ECX,[ESP+10]
6FC97E69 . 8B53 14 MOV EDX,[EBX+14]
6FC97E6C . 6A 04 PUSH 4 ; only difference from other call below
6FC97E6E . 51 PUSH ECX
6FC97E6F . 8BCE MOV ECX,ESI
6FC97E71 . E8 EABEFFFF CALL D2Game.6FC93D60 ; PostNpcMsg(4)
6FC97E76 . 5F POP EDI
6FC97E77 . 5E POP ESI
6FC97E78 . 5D POP EBP
6FC97E79 . 5B POP EBX
6FC97E7A . 83C4 08 ADD ESP,8
6FC97E7D . C3 RETN ; }
6FC97E7E > 83FD 01 CMP EBP,1 ; if(pHistory->bit0)
6FC97E81 . 74 3C JE SHORT D2Game.6FC97EBF ; return
6FC97E83 . 8A46 0C MOV AL,[ESI+C]
6FC97E86 . 3C 04 CMP AL,4 ; if(pQuest->0C >= 4) // byte value !
6FC97E88 . 72 08 JB SHORT D2Game.6FC97E92 ; {
6FC97E8A . 8B4C24 14 MOV ECX,[ESP+14]
6FC97E8E . 85C9 TEST ECX,ECX ; if(!pHistory->bit0D)
6FC97E90 . 74 2D JE SHORT D2Game.6FC97EBF ; return
6FC97E92 > 8A4E 09 MOV CL,[ESI+9] ; }
6FC97E95 . 84C9 TEST CL,CL ; if(!pQuest->09) // byte value !
6FC97E97 . 74 26 JE SHORT D2Game.6FC97EBF ; return
6FC97E99 . 25 FF000000 AND EAX,0FF
6FC97E9E . 8B0485 5825D36>MOV EAX,[EAX*4+6FD32558]
6FC97EA5 . 83F8 FF CMP EAX,-1
6FC97EA8 . 74 15 JE SHORT D2Game.6FC97EBF
6FC97EAA . 83F8 08 CMP EAX,8
6FC97EAD . 73 10 JNB SHORT D2Game.6FC97EBF
6FC97EAF . 8B5424 10 MOV EDX,[ESP+10] ; npcID
6FC97EB3 . 50 PUSH EAX ; 2 - State to select ?
6FC97EB4 . 52 PUSH EDX
6FC97EB5 . 8B53 14 MOV EDX,[EBX+14] ; pqParam->pTextHead
6FC97EB8 . 8BCE MOV ECX,ESI ; pQuest
6FC97EBA . E8 A1BEFFFF CALL D2Game.6FC93D60 ; alloc(0C bytes) insert at pTextHead->pText
6FC97EBF > 5F POP EDI
6FC97EC0 . 5E POP ESI
6FC97EC1 . 5D POP EBP
6FC97EC2 . 5B POP EBX
6FC97EC3 . 83C4 08 ADD ESP,8
6FC97EC6 . C3 RETN
*/
void FASTCALL Q1A0(Quest *pQuest,QParam *pqParam) // NPC Selected
{
D2Game* ptGame = pqParam->ptGame;
Unit* ptPlayer = pqParam->ptPlayer;
Unit* pNPCUnit = pqParam->ptNPCUnit;
DWORD diff = ptGame->Difficulty;
PlayerData* ptPlayerData=GetPlayerData(ptPlayer);
DWORD* pHist=(DWORD *)ptPlayerData->ptQuest[diff];
DWORD bit0=GetBit(pHist,pQuest->eFilter,0);
DWORD bitD=GetBit(pHist,pQuest->eFilter,0x0D);
DWORD npcID;
DWORD playerID;
if(pNPCUnit)
npcID=pNPCUnit->nUnitId;
else
npcID=-1;
if(GetBit(pHist,pQuest->eFilter,1))
{
PostNPCMsg(pQuest,pqParam->pTextHead,npcID,3);
return;
}
if(ptPlayer)
playerID=ptPlayer->nUnitUnid;
else
playerID=-1;
if(QuestFindPlayer(pQuest,playerID)==1)
{
PostNPCMsg(pQuest,pqParam->pTextHead,npcID,4);
return;
}
if(bit0==1)
return;
if(pQuest->bState>=4)
{
if(!bitD)
return;
}
if(!pQuest->bUnk09)
return;
DWORD msgID=msgTbl[pQuest->bState];
if(msgID!=-1 && msgID<8)
PostNPCMsg(pQuest,pqParam->pTextHead,npcID,msgID);
}
//=========================================================================
// Quest 1 - pCallback[11] (+CC) - MsgPosted
/*
6FC97BA0 . 51 PUSH ECX ; Quest 1 Callback 11(+CC)
6FC97BA1 . 53 PUSH EBX
6FC97BA2 . 55 PUSH EBP
6FC97BA3 . 56 PUSH ESI
6FC97BA4 . 57 PUSH EDI
6FC97BA5 . 8BF1 MOV ESI,ECX ; pQuest
6FC97BA7 . 8BFA MOV EDI,EDX ; pqParams
6FC97BA9 . 8B46 18 MOV EAX,[ESI+18] ; pQuest->QuestBytes
6FC97BAC . 66:817F 14 940>CMP WORD PTR [EDI+14],94 ; if(NPC ID != Akara)
6FC97BB2 . 66:8B5F 18 MOV BX,[EDI+18] ; pqParam[18h] ? (strKey)
6FC97BB6 . 894424 10 MOV [ESP+10],EAX ; pQuest->QuestBytes
6FC97BBA . 0F85 66010000 JNZ D2Game.6FC97D26 ; return;
6FC97BC0 . 8B47 0C MOV EAX,[EDI+C] ; ptPlayer
6FC97BC3 . 8B6E 04 MOV EBP,[ESI+4] ; ptGame
6FC97BC6 . 50 PUSH EAX
6FC97BC7 . E8 2A3A0800 CALL <JMP.&D2Common.#10424> ; GetPlayerData
6FC97BCC . 33C9 XOR ECX,ECX
6FC97BCE . 66:83FB 40 CMP BX,40
6FC97BD2 . 8A4D 6D MOV CL,[EBP+6D] ; ptGame->diff
6FC97BD5 . 8B6C88 10 MOV EBP,[EAX+ECX*4+10] ; pHistory[diff]
6FC97BD9 . 75 46 JNZ SHORT D2Game.6FC97C21
6FC97BDB . 8B5424 10 MOV EDX,[ESP+10] ; pQuest->QuestBytes
6FC97BDF . 68 DD000000 PUSH 0DD
6FC97BE4 . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC97BE9 . 8BCE MOV ECX,ESI
6FC97BEB . C682 86000000 >MOV BYTE PTR [EDX+86],1
6FC97BF2 . BA 02000000 MOV EDX,2
6FC97BF7 . E8 F4D0FFFF CALL D2Game.6FC94CF0 ; SetGameState(pQuest,2,FILE_,LINE_)
6FC97BFC . 8B4E 04 MOV ECX,[ESI+4] ; pQuest->ptGame
6FC97BFF . 33D2 XOR EDX,EDX ; 0
6FC97C01 . 68 307DC96F PUSH D2Game.6FC97D30 ; pfnIterate1
6FC97C06 . 6A 00 PUSH 0
6FC97C08 . E8 33500200 CALL D2Game.6FCBCC40 ; Iterate1(ptGame,0,0,pfnIterate1);
6FC97C0D . 8B47 08 MOV EAX,[EDI+8] ; NPCUnit
6FC97C10 . 8B0F MOV ECX,[EDI] ; ptGame
6FC97C12 . 8B57 0C MOV EDX,[EDI+C] ; ptPlayer
6FC97C15 . 50 PUSH EAX ; /Arg1
6FC97C16 . E8 F5F2FFFF CALL D2Game.6FC96F10 ; \D2Game.6FC96F10 //DisplayNPCMessage
6FC97C1B . 5F POP EDI
6FC97C1C . 5E POP ESI
6FC97C1D . 5D POP EBP
6FC97C1E . 5B POP EBX
6FC97C1F . 59 POP ECX
6FC97C20 . C3 RETN
6FC97C21 > 66:83FB 4C CMP BX,4C
6FC97C25 . 0F85 FB000000 JNZ D2Game.6FC97D26
6FC97C2B . 8B8E E0000000 MOV ECX,[ESI+E0]
6FC97C31 . 6A 01 PUSH 1
6FC97C33 . 51 PUSH ECX
6FC97C34 . 55 PUSH EBP
6FC97C35 . E8 DA3C0800 CALL <JMP.&D2Common.#11107>
6FC97C3A . 83F8 01 CMP EAX,1 ; if(GetBit(1)!=1)
6FC97C3D . 0F85 E3000000 JNZ D2Game.6FC97D26 ; return
6FC97C43 . 8B96 E0000000 MOV EDX,[ESI+E0]
6FC97C49 . 6A 0D PUSH 0D
6FC97C4B . 52 PUSH EDX
6FC97C4C . 55 PUSH EBP
6FC97C4D . E8 C23C0800 CALL <JMP.&D2Common.#11107>
6FC97C52 . 33DB XOR EBX,EBX
6FC97C54 . 85C0 TEST EAX,EAX ; if(GetBit(0xD))
6FC97C56 . 74 6F JE SHORT D2Game.6FC97CC7 ; {
6FC97C58 . 807E 0C 05 CMP BYTE PTR [ESI+C],5 ; if(pQuest->bState!=5)
6FC97C5C . 74 63 JE SHORT D2Game.6FC97CC1 ; {
6FC97C5E . 68 E9000000 PUSH 0E9
6FC97C63 . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC97C68 . BA 05000000 MOV EDX,5
6FC97C6D . 8BCE MOV ECX,ESI
6FC97C6F . E8 7CD0FFFF CALL D2Game.6FC94CF0 ; SetGameState(pQuest,5,__FILE,__LINE
// assert (pSequence)
6FC97C74 . 8B86 EC000000 MOV EAX,[ESI+EC]
6FC97C7A . 50 PUSH EAX ; /CodeAddress
6FC97C7B . FF15 107CD26F CALL [<&KERNEL32.IsBadCodePtr>] ; \IsBadCodePtr
6FC97C81 . 85C0 TEST EAX,EAX
6FC97C83 . 74 1E JE SHORT D2Game.6FC97CA3
6FC97C85 . 68 EA000000 PUSH 0EA
6FC97C8A . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC97C8F . 68 0C19D36F PUSH D2Game.6FD3190C ; ASCII "pQuestInfo->pSequence"
6FC97C94 . E8 554A0800 CALL <JMP.&Fog.#10023>
6FC97C99 . 83C4 0C ADD ESP,0C
6FC97C9C . 6A FF PUSH -1
6FC97C9E . E8 4A4B0800 CALL D2Game.6FD1C7ED
6FC97CA3 > 8BCE MOV ECX,ESI
6FC97CA5 . FF96 EC000000 CALL [ESI+EC] ; pQuest->pSequence(pQuest);
6FC97CAB . BA 0D000000 MOV EDX,0D
6FC97CB0 . 8BCE MOV ECX,ESI
6FC97CB2 . 53 PUSH EBX
6FC97CB3 . 68 307BC96F PUSH D2Game.6FC97B30
6FC97CB8 . 53 PUSH EBX
6FC97CB9 . 885E 14 MOV [ESI+14],BL ; pQuest->bUnk14 = 0;
6FC97CBC . E8 DFCFFFFF CALL D2Game.6FC94CA0 ; IterateFn2(pQuest,0x0D,0,pfnIterate2,0);
6FC97CC1 > 899E A8000000 MOV [ESI+A8],EBX ; }
; pQuest->pCallback[2]=0;
6FC97CC7 > 8B8E E0000000 MOV ECX,[ESI+E0] ; }
;
6FC97CCD . 53 PUSH EBX
6FC97CCE . 51 PUSH ECX
6FC97CCF . 55 PUSH EBP
6FC97CD0 . E8 EF3D0800 CALL <JMP.&D2Common.#11108> ; SetBit(pHist,pQuest->eFilter,0) // Set bit 0 to 1
6FC97CD5 . 8B96 E0000000 MOV EDX,[ESI+E0]
6FC97CDB . 6A 01 PUSH 1
6FC97CDD . 52 PUSH EDX
6FC97CDE . 55 PUSH EBP
6FC97CDF . E8 E63D0800 CALL <JMP.&D2Common.#11109> ; ClearBit(pHist,pQuest->eFilter,1) // set bit 1 to 0
6FC97CE4 . 8B86 E0000000 MOV EAX,[ESI+E0]
6FC97CEA . 50 PUSH EAX
6FC97CEB . 55 PUSH EBP
6FC97CEC . E8 BF450800 CALL <JMP.&D2Common.#11110> ; UpdateHist(pHist,pQuest->eFilter); //??
6FC97CF1 . 8B4F 0C MOV ECX,[EDI+C]
6FC97CF4 . 53 PUSH EBX
6FC97CF5 . 6A 01 PUSH 1
6FC97CF7 . 6A 05 PUSH 5
6FC97CF9 . 51 PUSH ECX
6FC97CFA . E8 BB3B0800 CALL <JMP.&D2Common.#10518> ; AddStat(ptPlayer,5,1,0); // add skill points for reward
6FC97CFF . 8B47 0C MOV EAX,[EDI+C]
6FC97D02 . 3BC3 CMP EAX,EBX
6FC97D04 . 75 05 JNZ SHORT D2Game.6FC97D0B
6FC97D06 . 83C8 FF OR EAX,FFFFFFFF
6FC97D09 . EB 03 JMP SHORT D2Game.6FC97D0E
6FC97D0B > 8B40 0C MOV EAX,[EAX+C]
6FC97D0E > 8D4E 1C LEA ECX,[ESI+1C]
6FC97D11 . 8BD0 MOV EDX,EAX
6FC97D13 . E8 F8EAFFFF CALL D2Game.6FC96810
6FC97D18 . 8B57 08 MOV EDX,[EDI+8]
6FC97D1B . 8B0F MOV ECX,[EDI]
6FC97D1D . 52 PUSH EDX ; /Arg1
6FC97D1E . 8B57 0C MOV EDX,[EDI+C] ; |
6FC97D21 . E8 EAF1FFFF CALL D2Game.6FC96F10 ; \D2Game.6FC96F10
6FC97D26 > 5F POP EDI
6FC97D27 . 5E POP ESI
6FC97D28 . 5D POP EBP
6FC97D29 . 5B POP EBX
6FC97D2A . 59 POP ECX
6FC97D2B . C3 RETN
*/
void FASTCALL Q1CC(Quest *pQuest,QParam *pqParam) // msg played
{
DWORD npcID = pqParam->dwNpcID;
if(npcID != QUEST1_NPC)
return;
D2Game* ptGame = pqParam->ptGame;
Unit* ptPlayer = pqParam->ptPlayer;
Unit* ptNPCUnit = pqParam->ptNPCUnit;
WORD strKey = pqParam->wStrKey;
DWORD diff = ptGame->Difficulty;
PlayerData* ptPlayerData=GetPlayerData(ptPlayer);
DWORD* pHist=(DWORD *)ptPlayerData->ptQuest[diff];
BYTE* pQData= (BYTE *)pQuest->pQuestData;
if(strKey==0x40)
{
pQData[0x86]=1;
SetGameState(pQuest,2,__FILE__,__LINE__);
IterateFn1(ptGame,0,0,pfnIterate1);
DisplayNPCMsg(ptGame,ptPlayer,ptNPCUnit);
return;
}
if(strKey==0x4C)
{
if(GetBit(pHist,pQuest->eFilter,1)!=1)
return;
if(GetBit(pHist,pQuest->eFilter,0x0D))
{
if(pQuest->bState!=5)
{
SetGameState(pQuest,5,__FILE__,__LINE__);
pQuest->pSequence(pQuest);
pQuest->bUnk14 = 0;
IterateFn2(pQuest,0x0D,0,pfnIterate2,0); // last arg 0, no fn exec - just set pQuest->bUnk0B = 0x0D
}
pQuest->pCallback[2]=0;
}
SetBit(pHist,pQuest->eFilter,0); // Set bit 0 to 1
ClearBit(pHist,pQuest->eFilter,1); // set bit 1 to 0
UpdateHist(pHist,pQuest->eFilter); //??
D2CommonAddStat(ptPlayer,5,1,0); // add skill points for reward
DisplayNPCMsg(ptGame,ptPlayer,ptNPCUnit);
}
}
//=========================================================================
// Quest 1 - pCallback[2] (+A8) - Leave NPC
/*
6FC97AE0 . 8B42 08 MOV EAX,[EDX+8] ; Quest 1 Callback 2 (+A8)
6FC97AE3 . 56 PUSH ESI
6FC97AE4 . 85C0 TEST EAX,EAX ; if(!ptNPCUnit)
6FC97AE6 . 57 PUSH EDI ; return
6FC97AE7 . 8BF1 MOV ESI,ECX
6FC97AE9 . 74 3A JE SHORT D2Game.6FC97B25
6FC97AEB . 66:8178 04 940>CMP WORD PTR [EAX+4],94 ; if(ptNPCUnit->UnitID!=QUEST1_NPC)
6FC97AF1 . 75 32 JNZ SHORT D2Game.6FC97B25 ; return
6FC97AF3 . 8B7E 18 MOV EDI,[ESI+18] ; pQuest->QuestData
6FC97AF6 . BA 01000000 MOV EDX,1
6FC97AFB . 3897 86000000 CMP [EDI+86],DL ; if(QuestData+86 == 1)
6FC97B01 . 75 22 JNZ SHORT D2Game.6FC97B25 ; {
6FC97B03 . 52 PUSH EDX ; 1
6FC97B04 . 68 307BC96F PUSH D2Game.6FC97B30 ; pIterateFunc
6FC97B09 . 6A 00 PUSH 0 ; 0
6FC97B0B . C646 14 00 MOV BYTE PTR [ESI+14],0 ; pQuest->bUnk14=0
6FC97B0F . E8 8CD1FFFF CALL D2Game.6FC94CA0 ; UpdatePlayers(pQuest,State,0,pfnIterate,1)
6FC97B14 . C687 86000000 >MOV BYTE PTR [EDI+86],0 ; QuestData+86 = 0
6FC97B1B . C786 A8000000 >MOV DWORD PTR [ESI+A8],0 ; pQuest->pCallback(2)=0 !
6FC97B25 > 5F POP EDI ; }
6FC97B26 . 5E POP ESI
6FC97B27 . C3 RETN
*/
void FASTCALL Q1A8(Quest *pQuest,QParam *pqParam)
{
Unit* ptNPCUnit = pqParam->ptNPCUnit;
if(!ptNPCUnit)
return;
if(ptNPCUnit->nUnitId!=QUEST1_NPC)
return;
BYTE* pQData= (BYTE *)pQuest->pQuestData;
if(pQData[0x86]!=1)
return;
pQuest->bUnk14=0;
IterateFn2(pQuest,1,0,pfnIterate2,1); // UpdateClientQuests - Turn on +Quest btn ?
pQData[0x86]=0;
pQuest->pCallback[2]=0;
}
//=========================================================================
// Quest 1 - pCallback[3] (+AC) - LevelChange
/*
6FC981E0 . 55 PUSH EBP ; Quest1 CB 3 - (+AC)
6FC981E1 . 56 PUSH ESI
6FC981E2 . 57 PUSH EDI
6FC981E3 . 8BFA MOV EDI,EDX
6FC981E5 . 8BF1 MOV ESI,ECX
6FC981E7 . 8B4F 18 MOV ECX,[EDI+18] ; pqParam+18 ? - LevelID
6FC981EA . 8B47 14 MOV EAX,[EDI+14] ; pqParam+14 ?
6FC981ED . 8B6E 18 MOV EBP,[ESI+18] ; pQData=pQuest->QuestData
6FC981F0 . 83F9 08 CMP ECX,8 ; if(eLevelID==8)
6FC981F3 . 0F85 80000000 JNZ D2Game.6FC98279 ; {
6FC981F9 . 8A46 09 MOV AL,[ESI+9] ;
6FC981FC . 84C0 TEST AL,AL ; if(pQuest->bUnk09)
6FC981FE . 0F84 1D010000 JE D2Game.6FC98321 ; return
6FC98204 . 8A46 0C MOV AL,[ESI+C] ;
6FC98207 . 32C9 XOR CL,CL ; tmp=0;
6FC98209 . 3C 01 CMP AL,1
6FC9820B . 74 04 JE SHORT D2Game.6FC98211 ; if(pQuest->bState==1 ||
6FC9820D . 3C 02 CMP AL,2 ; pQuest->bState==2)
6FC9820F . 75 18 JNZ SHORT D2Game.6FC98229 ; {
6FC98211 > 68 35020000 PUSH 235
6FC98216 . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC9821B . BA 03000000 MOV EDX,3
6FC98220 . 8BCE MOV ECX,ESI
6FC98222 . E8 C9CAFFFF CALL D2Game.6FC94CF0 ; SetGameState(pQuest,3,__FILE__,__LINE__);
6FC98227 . B1 01 MOV CL,1 ; tmp=1;
; }
6FC98229 > C685 85000000 >MOV BYTE PTR [EBP+85],1 ; pQData[0x85]=1;
6FC98230 . 8A46 0B MOV AL,[ESI+B] ;
6FC98233 . 3C 02 CMP AL,2 ; if(pQuest->bUnk0B<2)
6FC98235 . 73 25 JNB SHORT D2Game.6FC9825C ; {
6FC98237 . 6A 01 PUSH 1
6FC98239 . 68 307BC96F PUSH D2Game.6FC97B30
6FC9823E . 6A 00 PUSH 0
6FC98240 . BA 02000000 MOV EDX,2
6FC98245 . 8BCE MOV ECX,ESI
6FC98247 . C646 14 00 MOV BYTE PTR [ESI+14],0 pQuest->bUnk14=0;
6FC9824B . E8 50CAFFFF CALL D2Game.6FC94CA0 ; IterateFn2(pQuest,2,0,pfnIterate2,1);
6FC98250 . C786 A8000000 >MOV DWORD PTR [ESI+A8],0 ; pQuest->pCallback[2]=0;
6FC9825A . EB 08 JMP SHORT D2Game.6FC98264 ; }else{
6FC9825C > 84C9 TEST CL,CL ; if(!tmp)
6FC9825E . 0F84 BD000000 JE D2Game.6FC98321 ; return;
6FC98264 > 8B4E 04 MOV ECX,[ESI+4] ; }
6FC98267 . 68 307DC96F PUSH D2Game.6FC97D30
6FC9826C . 6A 00 PUSH 0
6FC9826E . 33D2 XOR EDX,EDX
6FC98270 . E8 CB490200 CALL D2Game.6FCBCC40 ; IterateFn1(ptGame,0,0,pfnIterate1);
6FC98275 . 5F POP EDI ; return
6FC98276 . 5E POP ESI
6FC98277 . 5D POP EBP
6FC98278 . C3 RETN
6FC98279 > 83F8 01 CMP EAX,1 ; } // endif level 8
6FC9827C . 0F85 9F000000 JNZ D2Game.6FC98321 ; if(pqParam->dwUnk14!=1)
6FC98282 . 8BD7 MOV EDX,EDI ; return
6FC98284 . 8BCE MOV ECX,ESI
6FC98286 . E8 65E6FFFF CALL D2Game.6FC968F0 ; QuestRemovePlayer(pQuest,pqParam);
6FC9828B . 807E 0C 02 CMP BYTE PTR [ESI+C],2 ; if(pQuest->bState!=2)
6FC9828F . 0F85 8C000000 JNZ D2Game.6FC98321 ; return;
6FC98295 . 8B47 0C MOV EAX,[EDI+C] ;
6FC98298 . 8B3F MOV EDI,[EDI]
6FC9829A . 50 PUSH EAX
6FC9829B . E8 56330800 CALL <JMP.&D2Common.#10424> ; GetPlayerData(ptPlayer)
6FC982A0 . 8B96 E0000000 MOV EDX,[ESI+E0]
6FC982A6 . 33C9 XOR ECX,ECX
6FC982A8 . 8A4F 6D MOV CL,[EDI+6D]
6FC982AB . 6A 00 PUSH 0
6FC982AD . 52 PUSH EDX
6FC982AE . 8B7C88 10 MOV EDI,[EAX+ECX*4+10] ; GetHist(ptGame,ptPlayerData);
6FC982B2 . 57 PUSH EDI
6FC982B3 . E8 5C360800 CALL <JMP.&D2Common.#11107> ;
6FC982B8 . 83F8 01 CMP EAX,1 ; if(GetBit(0))
6FC982BB . 74 64 JE SHORT D2Game.6FC98321 ; return
6FC982BD . 8B86 E0000000 MOV EAX,[ESI+E0]
6FC982C3 . 6A 01 PUSH 1
6FC982C5 . 50 PUSH EAX
6FC982C6 . 57 PUSH EDI
6FC982C7 . E8 48360800 CALL <JMP.&D2Common.#11107>
6FC982CC . 83F8 01 CMP EAX,1 ; if(GetBit(1))
6FC982CF . 74 50 JE SHORT D2Game.6FC98321 ; return
6FC982D1 . 68 51020000 PUSH 251
6FC982D6 . 68 D044D36F PUSH D2Game.6FD344D0 ; ASCII "..\\D2Game/Quests/a1q1.cpp"
6FC982DB . BA 03000000 MOV EDX,3
6FC982E0 . 8BCE MOV ECX,ESI
6FC982E2 . E8 09CAFFFF CALL D2Game.6FC94CF0 ; SetGameState(pQuest,3,__FILE__,__LINE__);
6FC982E7 . 8B4E 04 MOV ECX,[ESI+4]
6FC982EA . 33D2 XOR EDX,EDX
6FC982EC . 68 307DC96F PUSH D2Game.6FC97D30 ; pfnIterate1
6FC982F1 . 6A 00 PUSH 0
6FC982F3 . E8 48490200 CALL D2Game.6FCBCC40 ; IterateFn1(ptGame,0,0,pfnIterate1);
6FC982F8 . 807E 0B 01 CMP BYTE PTR [ESI+B],1 ; if(pQuest->bUnk0B==1)
6FC982FC . 74 23 JE SHORT D2Game.6FC98321 ; return
6FC982FE . 6A 01 PUSH 1
6FC98300 . 68 307BC96F PUSH D2Game.6FC97B30
6FC98305 . 6A 00 PUSH 0
6FC98307 . BA 01000000 MOV EDX,1
6FC9830C . 8BCE MOV ECX,ESI
6FC9830E . C646 14 00 MOV BYTE PTR [ESI+14],0 ; pQuest->bUnk14=0;
6FC98312 . E8 89C9FFFF CALL D2Game.6FC94CA0 ; IterateFn2(pQuest,1,0,pfnIterate2,1);
6FC98317 . C786 A8000000 >MOV DWORD PTR [ESI+A8],0 ; pQuest->pCallback[2]=0;
6FC98321 > 5F POP EDI ; return
6FC98322 . 5E POP ESI
6FC98323 . 5D POP EBP
6FC98324 . C3 RETN
*/
void FASTCALL Q1AC(Quest *pQuest,QParam *pqParam) //LevelChanged
{
DWORD eLevel = pqParam->eLevelID;
D2Game* ptGame = pqParam->ptGame;
Unit* ptPlayer = pqParam->ptPlayer;
// Unit* ptNPCUnit = pqParam->ptNPCUnit;
// WORD strKey = pqParam->wStrKey;
DWORD diff = ptGame->Difficulty;
PlayerData* ptPlayerData=GetPlayerData(ptPlayer);
DWORD* pHist=(DWORD *)ptPlayerData->ptQuest[diff];
BYTE* pQData= (BYTE *)pQuest->pQuestData;
if(eLevel==QUEST1_LEVEL)
{
if(!pQuest->bUnk09)
return;
BOOL tmp = 0;
if(pQuest->bState==1 ||
pQuest->bState==2)
{
SetGameState(pQuest,3,__FILE__,__LINE__);
tmp=1;
}
pQData[0x85]=1;
if(pQuest->bUnk0B<2)
{
pQuest->bUnk14=0;
IterateFn2(pQuest,2,0,pfnIterate2,1);
pQuest->pCallback[2]=0;
}else if(!tmp)
return;
IterateFn1(ptGame,0,0,pfnIterate1);
return;
}
if(pqParam->dwUnk14!=1)
return;
QuestRemovePlayer(pQuest,pqParam);
if(pQuest->bState!=2)
return;
if(GetBit(pHist,pQuest->eFilter,0))
return;
if(GetBit(pHist,pQuest->eFilter,1))
return;
SetGameState(pQuest,3,__FILE__,__LINE__);
IterateFn1(ptGame,0,0,pfnIterate1);
if(pQuest->bUnk0B==1)
return;
pQuest->bUnk14=0;
IterateFn2(pQuest,1,0,pfnIterate2,1);
pQuest->pCallback[2]=0;
}
continued next post.