diff --git a/msvc2003/devilution/comparer-config.toml b/msvc2003/devilution/comparer-config.toml index 82146f47..6225ee1b 100644 --- a/msvc2003/devilution/comparer-config.toml +++ b/msvc2003/devilution/comparer-config.toml @@ -962,6 +962,30 @@ addr = 0x41D260 name = "InitializeGame" addr = 0x41D550 +[[func]] +name = "ClearPermitStage" +addr = 0x41D610 + +[[func]] +name = "AddPermitStage" +addr = 0x41D630 + +[[func]] +name = "SubPermitStage" +addr = 0x41D6A0 + +[[func]] +name = "MoveStageSelectCursor" +addr = 0x41D740 + +[[func]] +name = "PutStageSelectObject" +addr = 0x41D840 + +[[func]] +name = "StageSelectLoop" +addr = 0x41DA00 + [[func]] name = "ShootBullet_Frontia1" addr = 0x41DBD0 diff --git a/src/SelStage.cpp b/src/SelStage.cpp index 35d5c2d4..1664e6eb 100644 --- a/src/SelStage.cpp +++ b/src/SelStage.cpp @@ -21,73 +21,82 @@ void ClearPermitStage(void) memset(gPermitStage, 0, 0x40); } -bool AddPermitStage(int index, int event) +BOOL AddPermitStage(int index, int event) { - for (int i = 0; i < 8; ++i) + int i = 0; + while (i < 8) { - if (gPermitStage[i].index == 0 || gPermitStage[i].index == index) - { - gPermitStage[i].index = index; - gPermitStage[i].event = event; - return true; - } + if (gPermitStage[i].index == index) + break; + + if (gPermitStage[i].index == 0) + break; + + ++i; } - return false; + if (i == 8) + return FALSE; + + gPermitStage[i].index = index; + gPermitStage[i].event = event; + + return TRUE; } -bool SubPermitStage(int index) +BOOL SubPermitStage(int index) { int i; - for (i = 0; i < 8 && gPermitStage[i].index != index; ++i); + for (i = 0; i < 8; ++i) + if (gPermitStage[i].index == index) + break; #ifdef FIX_BUGS - if (i != 8) + if (i == 8) #else - if (i != 32) + if (i == 32) #endif + return FALSE; + + for (i += 1; i < 8; ++i) { - int ia; - for (ia = i + 1; ia < 8; ++ia) - { - gPermitStage[ia - 1].index = gPermitStage[ia].index; - gPermitStage[ia - 1].event = gPermitStage[ia].event; - } - - gPermitStage[ia - 1].index = 0; - gPermitStage[ia - 1].event = 0; - - return true; + gPermitStage[i - 1] = gPermitStage[i]; } - return false; + gPermitStage[i - 1].index = 0; + gPermitStage[i - 1].event = 0; + + return TRUE; } void MoveStageSelectCursor(void) { - int stage_num; - for (stage_num = 0; gPermitStage[stage_num].index != 0; ++stage_num); + int stage_num = 0; + while (gPermitStage[stage_num].index != 0) + ++stage_num; - if (stage_num) - { - if (gKeyTrg & gKeyLeft) - --gSelectedStage; + int stage_x = (WINDOW_WIDTH - 40 * stage_num) / 2; // Unused - if (gKeyTrg & gKeyRight) - ++gSelectedStage; + if (stage_num == 0) + return; - if (gSelectedStage < 0) - gSelectedStage = stage_num - 1; + if (gKeyTrg & gKeyLeft) + --gSelectedStage; - if (stage_num - 1 < gSelectedStage) - gSelectedStage = 0; + if (gKeyTrg & gKeyRight) + ++gSelectedStage; - if ((gKeyRight | gKeyLeft) & gKeyTrg) - StartTextScript(gPermitStage[gSelectedStage].index + 1000); + if (gSelectedStage < 0) + gSelectedStage = stage_num - 1; - if ((gKeyRight | gKeyLeft) & gKeyTrg) - PlaySoundObject(1, 1); - } + if (gSelectedStage > stage_num - 1) + gSelectedStage = 0; + + if ((gKeyLeft | gKeyRight) & gKeyTrg) + StartTextScript(gPermitStage[gSelectedStage].index + 1000); + + if ((gKeyLeft | gKeyRight) & gKeyTrg) + PlaySoundObject(1, 1); } void PutStageSelectObject(void) @@ -103,25 +112,33 @@ void PutStageSelectObject(void) RECT rcTitle1 = {80, 64, 144, 72}; + int i; + int stage_num; + int stage_x; + RECT rcStage; + if (gStageSelectTitleY > (WINDOW_HEIGHT / 2) - 74) --gStageSelectTitleY; PutBitmap3(&rcView, (WINDOW_WIDTH / 2) - 32, gStageSelectTitleY, &rcTitle1, SURFACE_ID_TEXT_BOX); - int stage_num; - for (stage_num = 0; gPermitStage[stage_num].index; ++stage_num); + stage_num = 0; + while (gPermitStage[stage_num].index) + ++stage_num; ++flash; if (stage_num) { - int stage_x = (WINDOW_WIDTH - 40 * stage_num) / 2; + stage_x = (WINDOW_WIDTH - 40 * stage_num) / 2; PutBitmap3(&rcView, stage_x + 40 * gSelectedStage, (WINDOW_HEIGHT / 2) - 56, &rcCur[(flash >> 1) % 2], SURFACE_ID_TEXT_BOX); - for (int i = 0; i < 8 && gPermitStage[i].index; ++i) + for (i = 0; i < 8; ++i) { - RECT rcStage; + if (gPermitStage[i].index == 0) + break; + rcStage.left = 32 * (gPermitStage[i].index % 8); rcStage.right = rcStage.left + 32; rcStage.top = 16 * (gPermitStage[i].index / 8); @@ -145,26 +162,30 @@ int StageSelectLoop(int *p_event) gStageSelectTitleY = (WINDOW_HEIGHT / 2) - 66; StartTextScript(gPermitStage[gSelectedStage].index + 1000); - do + for (;;) { GetTrg(); if (gKey & KEY_ESCAPE) { - int escRet = Call_Escape(ghWnd); - if (escRet == 0) - return 0; - if (escRet == 2) - return 2; + switch (Call_Escape(ghWnd)) + { + case 0: + return 0; + case 2: + return 2; + } } MoveStageSelectCursor(); - int tscRet = TextScriptProc(); - if (tscRet == 0) - return 0; - if (tscRet == 2) - return 2; + switch (TextScriptProc()) + { + case 0: + return 0; + case 2: + return 2; + } #ifdef FIX_BUGS PutBitmap4(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB); @@ -178,12 +199,9 @@ int StageSelectLoop(int *p_event) if (gKeyTrg & gKeyOk) { StopTextScript(); - LoadTextScript_Stage(old_script_path); - *p_event = gPermitStage[gSelectedStage].event; - return 1; + break; } - - if (gKeyTrg & gKeyCancel) + else if (gKeyTrg & gKeyCancel) { StopTextScript(); LoadTextScript_Stage(old_script_path); @@ -192,8 +210,12 @@ int StageSelectLoop(int *p_event) } PutFramePerSecound(); - } - while (Flip_SystemTask(ghWnd)); - return 0; + if (!Flip_SystemTask(ghWnd)) + return 0; + } + + LoadTextScript_Stage(old_script_path); + *p_event = gPermitStage[gSelectedStage].event; + return 1; } diff --git a/src/SelStage.h b/src/SelStage.h index 7a2000bd..419b94b7 100644 --- a/src/SelStage.h +++ b/src/SelStage.h @@ -1,5 +1,7 @@ #pragma once +#include "WindowsWrapper.h" + struct PERMIT_STAGE { int index; @@ -9,8 +11,8 @@ struct PERMIT_STAGE extern PERMIT_STAGE gPermitStage[8]; void ClearPermitStage(void); -bool AddPermitStage(int index, int event); -bool SubPermitStage(int index); +BOOL AddPermitStage(int index, int event); +BOOL SubPermitStage(int index); void MoveStageSelectCursor(void); void PutStageSelectObject(void); int StageSelectLoop(int *p_event);