offset 414bf0 #define rectMax=0D rectMaxx10=0D0 rcLeft.left=EBP-0D0 rcLeft.top=EBP-0CC rcLeft.right=EBP-0C8 rcLeft.bottom=EBP-0C4 rcRight.left=EBP-1A0 rcRight.top=EBP-19C rcRight.right=EBP-198 rcRight.bottom=EBP-194 gMC.rect.left=49E69C gMC.rect.top=49E6A0 gMC.rect.right=49E6A4 gMC.rect.bottom=49E6A8 gMC.cond=49E638 gMC.flag=49E63C gMC.ani_no=49E678 gMC.ani_wait=49E674 gMC.up=49E644 gMC.down=49E648 gMC.ym=49E670 gMC.direct=49E640 gMC.air=49E6DC gKey_addr=49E210 gKeyUp=493634 gKeyLeft=493630 gKeyRight=493638 bKey=EBP+8 PlaySoundObject=00420640 #enddefine PUSH EBP MOV EBP,ESP SUB ESP,1A0 ; or whatever PUSH ESI PUSH EDI XOR ESI,ESI ; FRAMERECTS ; Push left framerects onto stack for ease of looping PUSH 0D0 ; DROWNING SPRITES PUSH 70 PUSH 60 PUSH 30 PUSH 50 PUSH 30 PUSH 40 PUSH 30 PUSH 0 PUSH 20 PUSH 0 PUSH 10 PUSH 0 MOV EAX, 0 MOV ECX, 10 MOV EDX, 20 JMP :loopbody :looptop ADD ESI, 10 CMP ESI, rectMaxx10 JGE :loopend :loopbody ; Left top = 0, Right top = 0x10 MOV [rcLeft.top+ESI], EAX | MOV [rcRight.top+ESI], ECX ; Left bottom = 0x10, Right bottom = 0x20 MOV [rcLeft.bottom+ESI], ECX | MOV [rcRight.bottom+ESI], EDX POP EDI ; Left/Right left = value from stack MOV [rcLeft.left+ESI], EDI | MOV [rcRight.left+ESI], EDI ADD EDI, 10 ; Left/Right right = value from stack + 0x10 MOV [rcLeft.right+ESI], EDI | MOV [rcRight.right+ESI], EDI JMP :looptop :loopend ; if (gMC.air <= 0) MOV EDX, [gMC.air] CMP EDX, 0 JG :checkCond MOV [gMC.ani_no], 0C JMP :checkDir ; if (gMC.cond & 2) :checkCond MOVZX EAX, BYTE [gMC.cond] TEST EAX, 00000002 JNE :return ; if (gMC.flag & 8) :checkFlag MOV ECX, [gMC.flag] TEST ECX, 00000008 JE :checkUp ; if (gMC.cond & 1) TEST EAX, 00000001 JE :keycheckWalk MOV [gMC.ani_no], 0B JMP :checkDir ; else if (gKey & (gKeyLeft | gKeyRight) && bKey) :keycheckWalk MOV ECX, [gKey_addr] MOV EDX, [gKeyLeft] OR EDX, [gKeyRight] TEST ECX, EDX ; gKey & (gKeyLeft | gKeyRight) JE :keycheckStop CMP [bKey], 0 ; bKey JE :keycheckStop ; if (gKey & gKeyUp) TEST ECX, [gKeyUp] JE :WalkFrames :UpWalkFrames PUSH 6 PUSH 9 PUSH 9 PUSH 7 JMP :WalkAni :WalkFrames PUSH 1 PUSH 4 PUSH 4 PUSH 2 :WalkAni OR EAX, 00000004 MOV BYTE [gMC.cond], AL ;gMC.cond |= 4 POP EAX ; 7 if looking up, else 2 POP ECX ; 9 if looking up, else 4 MOV ESI, [gMC.ani_wait] INC ESI ; ++gMC.ani_wait MOV EDI, [gMC.ani_no] ; if (++gMC.ani_wait > 4) CMP ESI, 4 JLE :checkWalkAni XOR ESI,ESI ; gMC.ani_wait = 0 INC EDI ; ++gMC.ani_no CMP EDI, EAX JE :playSound CMP EDI, ECX JNE :checkWalkAni :playSound PUSH 1 PUSH 18 CALL PlaySoundObject ADD ESP,8 ; UP: if (gMC.ani_no > 9 || gMC.ani_no < 6) ; ELSE: if (gMC.ani_no > 4 || gMC.ani_no < 1) :checkWalkAni MOV [gMC.ani_wait], ESI POP EAX ; 9 if looking up, else 4 POP ECX ; 6 if looking up, else 1 CMP EDI, EAX JG :resetWalkAni CMP EDI, ECX JGE :setAniNo :resetWalkAni MOV EDI, ECX :setAniNo MOV [gMC.ani_no], EDI JMP :checkDir :keyChecKStop TEST ECX, [gKeyUp] JE :StopFrame CMP [bKey], 0 JE :StopFrame :UpStopFrame PUSH 5 JMP :StopAni :StopFrame PUSH 0 :StopAni TEST EAX, 00000004 JE :SetStopAni PUSH 1 PUSH 18 CALL PlaySoundObject ADD ESP,8 :SetStopAni MOVZX EAX, BYTE [gMC.cond] AND EAX, FFFFFFFB MOV BYTE [gMC.cond], AL POP ECX MOV [gMC.ani_no], ECX JMP :checkDir :checkUp LEA EAX, [gMC.ani_no] CMP [gMC.up], 0 JE :checkDown MOV [EAX], 6 JMP :checkDir :checkDown CMP [gMC.down], 0 JE :checkYm MOV [EAX], 0A JMP :checkDir :checkYm CMP [gMC.ym], 0 JLE :ymLess :ymMore MOV [EAX], 1 JMP :checkDir :ymLess MOV [EAX], 3 :checkDir MOV EAX, [gMC.ani_no] SHL EAX, 4 CMP [gMC.direct], 0 JNE :rectRight :rectLeft LEA EAX, [EAX+rcLeft.left] JMP :setrect :rectRight LEA EAX, [EAX+rcRight.left] :setrect MOV ECX, [EAX] MOV [gMC.rect.left], ECX MOV ECX, [EAX+4] MOV [gMC.rect.top], ECX MOV ECX, [EAX+8] MOV [gMC.rect.right], ECX MOV ECX, [EAX+0C] MOV [gMC.rect.bottom], ECX :return POP EDI POP ESI MOV ESP,EBP POP EBP RETN INT3