Made Profile.cpp mostly ASM-accurate
The original code used MessageBoxA, but we haven't ported any of the WinAPI stuff yet, so there's no hWnd available.
This commit is contained in:
parent
25085ca6de
commit
f3d073affe
4 changed files with 75 additions and 28 deletions
|
@ -570,6 +570,22 @@ addr = 0x41C8F0
|
||||||
name = "MakePixelWaveData"
|
name = "MakePixelWaveData"
|
||||||
addr = 0x41CB10
|
addr = 0x41CB10
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "IsProfile"
|
||||||
|
addr = 0x41CFC0
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "SaveProfile"
|
||||||
|
addr = 0x41D040
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "LoadProfile"
|
||||||
|
addr = 0x41D260
|
||||||
|
|
||||||
|
[[func]]
|
||||||
|
name = "InitializeGame"
|
||||||
|
addr = 0x41D550
|
||||||
|
|
||||||
[[func]]
|
[[func]]
|
||||||
name = "ShootBullet_Frontia1"
|
name = "ShootBullet_Frontia1"
|
||||||
addr = 0x41DBD0
|
addr = 0x41DBD0
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
int g_GameFlags;
|
int g_GameFlags;
|
||||||
int gCounter;
|
int gCounter;
|
||||||
|
|
||||||
bool bContinue;
|
BOOL bContinue;
|
||||||
|
|
||||||
int Random(int min, int max)
|
int Random(int min, int max)
|
||||||
{
|
{
|
||||||
|
@ -405,7 +405,7 @@ int ModeTitle()
|
||||||
}
|
}
|
||||||
|
|
||||||
int char_y;
|
int char_y;
|
||||||
if (bContinue == 1)
|
if (bContinue == TRUE)
|
||||||
char_y = (WINDOW_HEIGHT + 54) / 2;
|
char_y = (WINDOW_HEIGHT + 54) / 2;
|
||||||
else
|
else
|
||||||
char_y = (WINDOW_HEIGHT + 14) / 2;
|
char_y = (WINDOW_HEIGHT + 14) / 2;
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "SDL.h"
|
||||||
|
|
||||||
#include "WindowsWrapper.h"
|
#include "WindowsWrapper.h"
|
||||||
|
|
||||||
#include "ArmsItem.h"
|
#include "ArmsItem.h"
|
||||||
|
@ -27,40 +29,41 @@
|
||||||
const char *gDefaultName = "Profile.dat";
|
const char *gDefaultName = "Profile.dat";
|
||||||
const char *gProfileCode = "Do041220";
|
const char *gProfileCode = "Do041220";
|
||||||
|
|
||||||
bool IsProfile()
|
BOOL IsProfile()
|
||||||
{
|
{
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
||||||
|
|
||||||
FILE *fp = fopen(path, "rb");
|
FILE *fp = fopen(path, "rb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return false;
|
return FALSE;
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SaveProfile(const char *name)
|
BOOL SaveProfile(const char *name)
|
||||||
{
|
{
|
||||||
//Get path
|
PROFILE profile;
|
||||||
|
FILE *fp;
|
||||||
|
char *FLAG = "FLAG";
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
|
|
||||||
|
//Get path
|
||||||
if (name)
|
if (name)
|
||||||
sprintf(path, "%s/%s", gModulePath, name);
|
sprintf(path, "%s/%s", gModulePath, name);
|
||||||
else
|
else
|
||||||
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
||||||
|
|
||||||
//Open file
|
//Open file
|
||||||
PROFILE profile;
|
fp = fopen(path, "wb");
|
||||||
|
|
||||||
FILE *fp = fopen(path, "wb");
|
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return false;
|
return FALSE;
|
||||||
|
|
||||||
//Set up profile
|
//Set up profile
|
||||||
memset(&profile, 0, sizeof(PROFILE));
|
memset(&profile, 0, sizeof(PROFILE));
|
||||||
memcpy(profile.code, gProfileCode, sizeof(profile.code));
|
memcpy(profile.code, gProfileCode, sizeof(profile.code));
|
||||||
memcpy(profile.FLAG, "FLAG", sizeof(profile.FLAG));
|
memcpy(profile.FLAG, FLAG, sizeof(profile.FLAG));
|
||||||
profile.stage = gStageNo;
|
profile.stage = gStageNo;
|
||||||
profile.music = gMusicNo;
|
profile.music = gMusicNo;
|
||||||
profile.x = gMC.x;
|
profile.x = gMC.x;
|
||||||
|
@ -81,6 +84,9 @@ bool SaveProfile(const char *name)
|
||||||
memcpy(profile.flags, gFlagNPC, sizeof(profile.flags));
|
memcpy(profile.flags, gFlagNPC, sizeof(profile.flags));
|
||||||
|
|
||||||
//Write to file
|
//Write to file
|
||||||
|
#ifdef NONPORTABLE
|
||||||
|
fwrite(&profile, sizeof(PROFILE), 1, fp);
|
||||||
|
#else
|
||||||
fwrite(profile.code, 8, 1, fp);
|
fwrite(profile.code, 8, 1, fp);
|
||||||
File_WriteLE32(profile.stage, fp);
|
File_WriteLE32(profile.stage, fp);
|
||||||
File_WriteLE32(profile.music, fp);
|
File_WriteLE32(profile.music, fp);
|
||||||
|
@ -112,20 +118,21 @@ bool SaveProfile(const char *name)
|
||||||
File_WriteLE32(profile.permitstage[stage].event, fp);
|
File_WriteLE32(profile.permitstage[stage].event, fp);
|
||||||
}
|
}
|
||||||
fwrite(profile.permit_mapping, 0x80, 1, fp);
|
fwrite(profile.permit_mapping, 0x80, 1, fp);
|
||||||
fwrite("FLAG", 4, 1, fp);
|
fwrite(FLAG, 4, 1, fp);
|
||||||
fwrite(profile.flags, 1000, 1, fp);
|
fwrite(profile.flags, 1000, 1, fp);
|
||||||
|
#endif
|
||||||
|
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LoadProfile(const char *name)
|
BOOL LoadProfile(const char *name)
|
||||||
{
|
{
|
||||||
//Get path
|
//Get path
|
||||||
char path[PATH_LENGTH];
|
char path[PATH_LENGTH];
|
||||||
|
|
||||||
if (name)
|
if (name)
|
||||||
strcpy(path, name);
|
sprintf(path, "%s", name);
|
||||||
else
|
else
|
||||||
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
sprintf(path, "%s/%s", gModulePath, gDefaultName);
|
||||||
|
|
||||||
|
@ -134,7 +141,7 @@ bool LoadProfile(const char *name)
|
||||||
|
|
||||||
FILE *fp = fopen(path, "rb");
|
FILE *fp = fopen(path, "rb");
|
||||||
if (fp == NULL)
|
if (fp == NULL)
|
||||||
return false;
|
return FALSE;
|
||||||
|
|
||||||
//Check header code
|
//Check header code
|
||||||
fread(profile.code, 8, 1, fp);
|
fread(profile.code, 8, 1, fp);
|
||||||
|
@ -143,11 +150,15 @@ bool LoadProfile(const char *name)
|
||||||
#ifdef FIX_BUGS
|
#ifdef FIX_BUGS
|
||||||
fclose(fp); // The original game forgets to close the file
|
fclose(fp); // The original game forgets to close the file
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Read data
|
//Read data
|
||||||
fseek(fp, 0, SEEK_SET); //Pixel epic redundant code 😎😎😎
|
fseek(fp, 0, SEEK_SET);
|
||||||
|
memset(&profile, 0, sizeof(PROFILE));
|
||||||
|
#ifdef NONPORTABLE
|
||||||
|
fread(&profile, sizeof(PROFILE), 1, fp);
|
||||||
|
#else
|
||||||
fread(profile.code, 8, 1, fp);
|
fread(profile.code, 8, 1, fp);
|
||||||
profile.stage = File_ReadLE32(fp);
|
profile.stage = File_ReadLE32(fp);
|
||||||
profile.music = File_ReadLE32(fp);
|
profile.music = File_ReadLE32(fp);
|
||||||
|
@ -181,6 +192,7 @@ bool LoadProfile(const char *name)
|
||||||
fread(profile.permit_mapping, 0x80, 1, fp);
|
fread(profile.permit_mapping, 0x80, 1, fp);
|
||||||
fread(profile.FLAG, 4, 1, fp);
|
fread(profile.FLAG, 4, 1, fp);
|
||||||
fread(profile.flags, 1000, 1, fp);
|
fread(profile.flags, 1000, 1, fp);
|
||||||
|
#endif
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
//Set things
|
//Set things
|
||||||
|
@ -198,7 +210,7 @@ bool LoadProfile(const char *name)
|
||||||
ChangeMusic(profile.music);
|
ChangeMusic(profile.music);
|
||||||
InitMyChar();
|
InitMyChar();
|
||||||
if (!TransferStage(profile.stage, 0, 0, 1))
|
if (!TransferStage(profile.stage, 0, 0, 1))
|
||||||
return false;
|
return FALSE;
|
||||||
|
|
||||||
//Set character properties
|
//Set character properties
|
||||||
gMC.equip = profile.equip;
|
gMC.equip = profile.equip;
|
||||||
|
@ -227,10 +239,10 @@ bool LoadProfile(const char *name)
|
||||||
InitStar();
|
InitStar();
|
||||||
ClearValueView();
|
ClearValueView();
|
||||||
gCurlyShoot_wait = 0;
|
gCurlyShoot_wait = 0;
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitializeGame()
|
BOOL InitializeGame()
|
||||||
{
|
{
|
||||||
InitMyChar();
|
InitMyChar();
|
||||||
gSelectedArms = 0;
|
gSelectedArms = 0;
|
||||||
|
@ -242,7 +254,24 @@ bool InitializeGame()
|
||||||
StartMapping();
|
StartMapping();
|
||||||
InitFlags();
|
InitFlags();
|
||||||
if (!TransferStage(13, 200, 10, 8))
|
if (!TransferStage(13, 200, 10, 8))
|
||||||
return false;
|
{
|
||||||
|
// TODO - restore this when hWnd is available
|
||||||
|
/*#if defined(NONPORTABLE) && defined(WINDOWS)
|
||||||
|
#ifdef JAPANESE
|
||||||
|
MessageBoxA(hWnd, "ステージの読み込みに失敗", "エラー", MB_OK);
|
||||||
|
#else
|
||||||
|
MessageBoxA(hWnd, "Failed to load stage", "Error", MB_OK);
|
||||||
|
#endif
|
||||||
|
#else*/
|
||||||
|
#ifdef JAPANESE
|
||||||
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "エラー", "ステージの読み込みに失敗", NULL);
|
||||||
|
#else
|
||||||
|
SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "Error", "Failed to load stage", NULL);
|
||||||
|
#endif
|
||||||
|
//#endif
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
ClearFade();
|
ClearFade();
|
||||||
SetFrameMyChar();
|
SetFrameMyChar();
|
||||||
SetFrameTargetMyChar(16);
|
SetFrameTargetMyChar(16);
|
||||||
|
@ -252,5 +281,5 @@ bool InitializeGame()
|
||||||
gCurlyShoot_wait = 0;
|
gCurlyShoot_wait = 0;
|
||||||
SetFadeMask();
|
SetFadeMask();
|
||||||
SetFrameTargetMyChar(16);
|
SetFrameTargetMyChar(16);
|
||||||
return true;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "WindowsWrapper.h"
|
||||||
|
|
||||||
#include "ArmsItem.h"
|
#include "ArmsItem.h"
|
||||||
#include "SelStage.h"
|
#include "SelStage.h"
|
||||||
|
|
||||||
|
@ -30,7 +32,7 @@ struct PROFILE
|
||||||
uint8_t flags[1000];
|
uint8_t flags[1000];
|
||||||
};
|
};
|
||||||
|
|
||||||
bool IsProfile();
|
BOOL IsProfile();
|
||||||
bool SaveProfile(const char *name);
|
BOOL SaveProfile(const char *name);
|
||||||
bool LoadProfile(const char *name);
|
BOOL LoadProfile(const char *name);
|
||||||
bool InitializeGame();
|
BOOL InitializeGame();
|
||||||
|
|
Loading…
Add table
Reference in a new issue