mirror of
https://github.com/pret/pokeheartgold.git
synced 2026-06-01 05:01:11 -05:00
148 lines
4.5 KiB
C
148 lines
4.5 KiB
C
#include "global.h"
|
|
#include "save_local_field_data.h"
|
|
#include "field_player_avatar.h"
|
|
#include "field_map_object.h"
|
|
#include "script_pokemon_util.h"
|
|
#include "unk_0203BA5C.h"
|
|
#include "constants/scrcmd.h"
|
|
|
|
struct LocalFieldData {
|
|
Location currentPosition;
|
|
Location entrancePosition;
|
|
Location previousPosition;
|
|
Location dynamicWarp;
|
|
Location specialSpawn;
|
|
u16 musicId;
|
|
u16 weather;
|
|
u16 lastSpawn;
|
|
u8 cameraType;
|
|
struct PlayerSaveData player;
|
|
u16 poisonStepCounter;
|
|
u16 safariStepCounter;
|
|
u16 safariBallCounter;
|
|
u8 filler7A[6];
|
|
};
|
|
|
|
struct SavedMapObjectList {
|
|
struct SavedMapObject subs[64];
|
|
};
|
|
|
|
u32 Save_LocalFieldData_sizeof(void) {
|
|
return sizeof(LocalFieldData);
|
|
}
|
|
|
|
u32 Save_MapObjects_sizeof(void) {
|
|
return sizeof(struct SavedMapObjectList);
|
|
}
|
|
|
|
void Save_MapObjects_Init(struct SavedMapObjectList *unk) {
|
|
MI_CpuClear32(unk, sizeof(struct SavedMapObjectList));
|
|
}
|
|
|
|
void Save_LocalFieldData_Init(LocalFieldData *localFieldData) {
|
|
memset(localFieldData, 0, sizeof(LocalFieldData));
|
|
PlayerSaveData_Init(&localFieldData->player);
|
|
localFieldData->lastSpawn = GetMomSpawnId();
|
|
}
|
|
|
|
Location *LocalFieldData_GetCurrentPosition(LocalFieldData *localFieldData) {
|
|
return &localFieldData->currentPosition;
|
|
}
|
|
|
|
Location *LocalFieldData_GetEntrancePosition(LocalFieldData *localFieldData) {
|
|
return &localFieldData->entrancePosition;
|
|
}
|
|
|
|
Location *LocalFieldData_GetPreviousPosition(LocalFieldData *localFieldData) {
|
|
return &localFieldData->previousPosition;
|
|
}
|
|
|
|
Location *LocalFieldData_GetSpecialSpawnWarpPtr(LocalFieldData *localFieldData) {
|
|
return &localFieldData->specialSpawn;
|
|
}
|
|
|
|
Location *LocalFieldData_GetDynamicWarp(LocalFieldData *localFieldData) {
|
|
return &localFieldData->dynamicWarp;
|
|
}
|
|
|
|
void LocalFieldData_SetDynamicWarp(LocalFieldData *localFieldData, const Location *location) {
|
|
localFieldData->dynamicWarp = *location;
|
|
}
|
|
|
|
u16 *LocalFieldData_GetMusicIdAddr(LocalFieldData *localFieldData) {
|
|
return &localFieldData->musicId;
|
|
}
|
|
|
|
u16 LocalFieldData_GetWeatherType(LocalFieldData *localFieldData) {
|
|
return localFieldData->weather;
|
|
}
|
|
|
|
void LocalFieldData_SetWeatherType(LocalFieldData *localFieldData, const u16 weather) {
|
|
localFieldData->weather = weather;
|
|
}
|
|
|
|
u16 LocalFieldData_GetBlackoutSpawn(LocalFieldData *localFieldData) {
|
|
return localFieldData->lastSpawn;
|
|
}
|
|
|
|
void LocalFieldData_SetBlackoutSpawn(LocalFieldData *localFieldData, const u16 spawn) {
|
|
localFieldData->lastSpawn = spawn;
|
|
}
|
|
|
|
u32 LocalFieldData_GetCameraType(LocalFieldData *localFieldData) {
|
|
return localFieldData->cameraType;
|
|
}
|
|
|
|
void LocalFieldData_SetCameraType(LocalFieldData *localFieldData, const u32 cameraType) {
|
|
localFieldData->cameraType = cameraType;
|
|
}
|
|
|
|
struct PlayerSaveData *LocalFieldData_GetPlayer(LocalFieldData *localFieldData) {
|
|
return &localFieldData->player;
|
|
}
|
|
|
|
u16 *LocalFieldData_GetSafariBallsCounter(LocalFieldData *localFieldData) {
|
|
return &localFieldData->safariBallCounter;
|
|
}
|
|
|
|
u16 *LocalFieldData_GetSafariStepsCounter(LocalFieldData *localFieldData) {
|
|
return &localFieldData->safariStepCounter;
|
|
}
|
|
|
|
u16 *LocalFieldData_GetPoisonStepCounter(LocalFieldData *localFieldData) {
|
|
return &localFieldData->poisonStepCounter;
|
|
}
|
|
|
|
LocalFieldData *Save_LocalFieldData_Get(SaveData *saveData) {
|
|
return SaveArray_Get(saveData, SAVE_LOCAL_FIELD_DATA);
|
|
}
|
|
|
|
struct SavedMapObjectList *Save_MapObjects_Get(SaveData *saveData) {
|
|
return SaveArray_Get(saveData, SAVE_MAP_OBJECTS);
|
|
}
|
|
|
|
void FieldSystem_SyncMapObjectsToSave(FieldSystem *fieldSystem) {
|
|
struct SavedMapObjectList *unk = Save_MapObjects_Get(fieldSystem->savedata);
|
|
FieldSystem_SyncMapObjectsToSaveEx(fieldSystem, fieldSystem->mapObjectMan, unk->subs, 64);
|
|
}
|
|
|
|
void FieldSystem_RestoreMapObjectsFromSave(FieldSystem *fieldSystem) {
|
|
struct SavedMapObjectList *unk = Save_MapObjects_Get(fieldSystem->savedata);
|
|
struct SavedMapObject *follower = SaveMapObjects_SearchSpriteId(unk->subs, 64, SPRITE_FOLLOWER_MON_SHAYMIN_SKY);
|
|
Pokemon *mon;
|
|
int species;
|
|
int form;
|
|
|
|
if (follower != NULL && follower->objId == obj_partner_poke) {
|
|
mon = GetFirstAliveMonInParty_CrashIfNone(SaveArray_Party_Get(fieldSystem->savedata));
|
|
species = GetMonData(mon, MON_DATA_SPECIES, NULL);
|
|
form = GetMonData(mon, MON_DATA_FORM, NULL);
|
|
if (species != SPECIES_SHAYMIN) {
|
|
GF_ASSERT(FALSE);
|
|
} else if (form == SHAYMIN_LAND) {
|
|
follower->gfxId = SPRITE_FOLLOWER_MON_SHAYMIN;
|
|
}
|
|
}
|
|
MapObjectManager_RestoreFromSave(fieldSystem->mapObjectMan, unk->subs, 64);
|
|
}
|