pmd-red/src/save_write.c

129 lines
3.4 KiB
C

#include "global.h"
#include "globaldata.h"
#include "code_80130A8.h"
#include "code_8098BDC.h"
#include "memory.h"
#include "save.h"
#include "save_write.h"
static EWRAM_DATA_2 SavePakWrite *sSavePakWrite = {0};
#include "data/save_write.h"
void PrepareSavePakWrite(s16 pokemonID)
{
OpenedFile *file;
s32 id_s32;
OpenedFile **preload_face;
id_s32 = pokemonID; // had to cast for asr shift
sub_80993D8();
sSavePakWrite = MemoryAlloc(sizeof(SavePakWrite), 5);
sSavePakWrite->pokeID = id_s32;
sSavePakWrite->faceFile = NULL;
sSavePakWrite->faceData = NULL;
if (pokemonID != MONSTER_NONE) {
file = GetDialogueSpriteDataPtr(pokemonID);
sSavePakWrite->faceFile = file;
sSavePakWrite->faceData = file->data;
sSavePakWrite->unk18 = 0;
sSavePakWrite->unk19 = 0;
sSavePakWrite->unk1A = 0;
sSavePakWrite->unk14 = 2;
sSavePakWrite->unk16 = 8;
}
if (sSavePakWrite->faceFile != 0) {
preload_face = &sSavePakWrite->faceFile;
sub_80141B4(sSavingAdventure, 0, preload_face, 0x20);
}
else
sub_80141B4(sSavingAdventure, 0, NULL, 0x20);
sSavePakWrite->state = 3;
}
bool8 WriteSavePak(void)
{
OpenedFile **faceFile;
u32 local_14;
u32 other_stack;
faceFile = NULL;
if (sSavePakWrite->faceFile != NULL)
faceFile = &sSavePakWrite->faceFile;
switch (sSavePakWrite->state) {
case 0:
sSavePakWrite->state = 7;
break;
case 1:
sSavePakWrite->unk4++;
if (sSavePakWrite->unk4 > 8) {
sub_80141B4(sWriteGamePak, 0, 0, 0x20);
sSavePakWrite->state = 3;
}
break;
case 2:
break;
case 3:
sSavePakWrite->state = 4;
break;
case 4:
local_14 = 0;
sub_80140DC();
sSavePakWrite->saveStatus = WriteSavetoPak(&local_14, sub_8011C1C());
switch (sSavePakWrite->saveStatus) {
case SAVE_COMPLETED:
if (sSavePakWrite->faceFile != NULL)
sub_80141B4(sSaveCompleted, 0, faceFile, 0x101);
else
sub_80141B4(sSaveCompleted, 0, faceFile, 0x101);
sSavePakWrite->state = 5;
break;
case SAVE_NOT_WRTTEN:
sub_80141B4(sSaveNotWritten, 0, 0, 0);
sSavePakWrite->state = 6;
break;
default:
if (sSavePakWrite->faceFile != NULL)
sub_80141B4(sSaveFailed, 0, faceFile, 0x101);
else
sub_80141B4(sSaveFailed, 0, faceFile, 0x101);
sSavePakWrite->state = 5;
break;
}
sub_8014114();
break;
case 5:
if (sub_80144A4(&other_stack) == 0)
sSavePakWrite->state = 7;
break;
case 6:
break;
case 7:
return FALSE;
}
return TRUE;
}
u32 GetSavePakStatus(void)
{
return sSavePakWrite->saveStatus;
}
void FinishWriteSavePak(void)
{
if (sSavePakWrite != NULL) {
if (sSavePakWrite->faceFile != NULL)
CloseFile(sSavePakWrite->faceFile);
MemoryFree(sSavePakWrite);
sSavePakWrite = NULL;
}
sub_80993E4();
}