Made SelStage.cpp ASM-accurate

This commit is contained in:
Clownacy 2019-05-13 21:31:14 +01:00
parent c9d5b3d03a
commit e1d3898d59
3 changed files with 116 additions and 68 deletions

View file

@ -962,6 +962,30 @@ addr = 0x41D260
name = "InitializeGame" name = "InitializeGame"
addr = 0x41D550 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]] [[func]]
name = "ShootBullet_Frontia1" name = "ShootBullet_Frontia1"
addr = 0x41DBD0 addr = 0x41DBD0

View file

@ -21,55 +21,65 @@ void ClearPermitStage(void)
memset(gPermitStage, 0, 0x40); 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)
{ {
if (gPermitStage[i].index == index)
break;
if (gPermitStage[i].index == 0)
break;
++i;
}
if (i == 8)
return FALSE;
gPermitStage[i].index = index; gPermitStage[i].index = index;
gPermitStage[i].event = event; gPermitStage[i].event = event;
return true;
}
}
return false; return TRUE;
} }
bool SubPermitStage(int index) BOOL SubPermitStage(int index)
{ {
int i; 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 #ifdef FIX_BUGS
if (i != 8) if (i == 8)
#else #else
if (i != 32) if (i == 32)
#endif #endif
return FALSE;
for (i += 1; i < 8; ++i)
{ {
int ia; gPermitStage[i - 1] = gPermitStage[i];
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[i - 1].index = 0;
gPermitStage[ia - 1].event = 0; gPermitStage[i - 1].event = 0;
return true; return TRUE;
}
return false;
} }
void MoveStageSelectCursor(void) void MoveStageSelectCursor(void)
{ {
int stage_num; int stage_num = 0;
for (stage_num = 0; gPermitStage[stage_num].index != 0; ++stage_num); while (gPermitStage[stage_num].index != 0)
++stage_num;
int stage_x = (WINDOW_WIDTH - 40 * stage_num) / 2; // Unused
if (stage_num == 0)
return;
if (stage_num)
{
if (gKeyTrg & gKeyLeft) if (gKeyTrg & gKeyLeft)
--gSelectedStage; --gSelectedStage;
@ -79,15 +89,14 @@ void MoveStageSelectCursor(void)
if (gSelectedStage < 0) if (gSelectedStage < 0)
gSelectedStage = stage_num - 1; gSelectedStage = stage_num - 1;
if (stage_num - 1 < gSelectedStage) if (gSelectedStage > stage_num - 1)
gSelectedStage = 0; gSelectedStage = 0;
if ((gKeyRight | gKeyLeft) & gKeyTrg) if ((gKeyLeft | gKeyRight) & gKeyTrg)
StartTextScript(gPermitStage[gSelectedStage].index + 1000); StartTextScript(gPermitStage[gSelectedStage].index + 1000);
if ((gKeyRight | gKeyLeft) & gKeyTrg) if ((gKeyLeft | gKeyRight) & gKeyTrg)
PlaySoundObject(1, 1); PlaySoundObject(1, 1);
}
} }
void PutStageSelectObject(void) void PutStageSelectObject(void)
@ -103,25 +112,33 @@ void PutStageSelectObject(void)
RECT rcTitle1 = {80, 64, 144, 72}; RECT rcTitle1 = {80, 64, 144, 72};
int i;
int stage_num;
int stage_x;
RECT rcStage;
if (gStageSelectTitleY > (WINDOW_HEIGHT / 2) - 74) if (gStageSelectTitleY > (WINDOW_HEIGHT / 2) - 74)
--gStageSelectTitleY; --gStageSelectTitleY;
PutBitmap3(&rcView, (WINDOW_WIDTH / 2) - 32, gStageSelectTitleY, &rcTitle1, SURFACE_ID_TEXT_BOX); PutBitmap3(&rcView, (WINDOW_WIDTH / 2) - 32, gStageSelectTitleY, &rcTitle1, SURFACE_ID_TEXT_BOX);
int stage_num; stage_num = 0;
for (stage_num = 0; gPermitStage[stage_num].index; ++stage_num); while (gPermitStage[stage_num].index)
++stage_num;
++flash; ++flash;
if (stage_num) 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); 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.left = 32 * (gPermitStage[i].index % 8);
rcStage.right = rcStage.left + 32; rcStage.right = rcStage.left + 32;
rcStage.top = 16 * (gPermitStage[i].index / 8); rcStage.top = 16 * (gPermitStage[i].index / 8);
@ -145,26 +162,30 @@ int StageSelectLoop(int *p_event)
gStageSelectTitleY = (WINDOW_HEIGHT / 2) - 66; gStageSelectTitleY = (WINDOW_HEIGHT / 2) - 66;
StartTextScript(gPermitStage[gSelectedStage].index + 1000); StartTextScript(gPermitStage[gSelectedStage].index + 1000);
do for (;;)
{ {
GetTrg(); GetTrg();
if (gKey & KEY_ESCAPE) if (gKey & KEY_ESCAPE)
{ {
int escRet = Call_Escape(ghWnd); switch (Call_Escape(ghWnd))
if (escRet == 0) {
case 0:
return 0; return 0;
if (escRet == 2) case 2:
return 2; return 2;
} }
}
MoveStageSelectCursor(); MoveStageSelectCursor();
int tscRet = TextScriptProc(); switch (TextScriptProc())
if (tscRet == 0) {
case 0:
return 0; return 0;
if (tscRet == 2) case 2:
return 2; return 2;
}
#ifdef FIX_BUGS #ifdef FIX_BUGS
PutBitmap4(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB); PutBitmap4(&rcView, 0, 0, &rcView, SURFACE_ID_SCREEN_GRAB);
@ -178,12 +199,9 @@ int StageSelectLoop(int *p_event)
if (gKeyTrg & gKeyOk) if (gKeyTrg & gKeyOk)
{ {
StopTextScript(); StopTextScript();
LoadTextScript_Stage(old_script_path); break;
*p_event = gPermitStage[gSelectedStage].event;
return 1;
} }
else if (gKeyTrg & gKeyCancel)
if (gKeyTrg & gKeyCancel)
{ {
StopTextScript(); StopTextScript();
LoadTextScript_Stage(old_script_path); LoadTextScript_Stage(old_script_path);
@ -192,8 +210,12 @@ int StageSelectLoop(int *p_event)
} }
PutFramePerSecound(); PutFramePerSecound();
}
while (Flip_SystemTask(ghWnd));
if (!Flip_SystemTask(ghWnd))
return 0; return 0;
}
LoadTextScript_Stage(old_script_path);
*p_event = gPermitStage[gSelectedStage].event;
return 1;
} }

View file

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "WindowsWrapper.h"
struct PERMIT_STAGE struct PERMIT_STAGE
{ {
int index; int index;
@ -9,8 +11,8 @@ struct PERMIT_STAGE
extern PERMIT_STAGE gPermitStage[8]; extern PERMIT_STAGE gPermitStage[8];
void ClearPermitStage(void); void ClearPermitStage(void);
bool AddPermitStage(int index, int event); BOOL AddPermitStage(int index, int event);
bool SubPermitStage(int index); BOOL SubPermitStage(int index);
void MoveStageSelectCursor(void); void MoveStageSelectCursor(void);
void PutStageSelectObject(void); void PutStageSelectObject(void);
int StageSelectLoop(int *p_event); int StageSelectLoop(int *p_event);