pokeplatinum/include/underground.h
scbroede 5b37fec40b
Some checks are pending
build / build (push) Waiting to run
document underground save data (#963)
2026-02-22 12:15:42 -08:00

234 lines
12 KiB
C

#ifndef POKEPLATINUM_UNDERGROUND_H
#define POKEPLATINUM_UNDERGROUND_H
#include "constants/string.h"
#include "generated/goods.h"
#include "generated/sphere_types.h"
#include "generated/traps.h"
#include "underground/defs.h"
#include "charcode.h"
#include "savedata.h"
#include "trainer_info.h"
#define MAX_CAPTURED_FLAG_RECORDS 5
#define MAX_UNDERGROUND_RECORD_VALUE 999999
enum CondensedCoordsIndex {
X_LOW_BITS_INDEX = 0,
HIGH_BITS_INDEX,
Z_LOW_BITS_INDEX,
CONDENSED_COORDS_BYTE_COUNT,
};
typedef struct UndergroundRecord {
u32 trainerScore : 20;
u32 peopleMet : 20;
u32 numGiftsGiven : 20;
u32 flagsStolen : 20; // never read; refers to taking a flag from another player, not from a base
u32 numSpheresDug : 20;
u32 numFossilsDug : 20;
u32 numNonFossilsDug : 20;
u32 numTrapHits : 20;
u32 numTrapsTriggered : 20;
u32 numPlayersHelped : 20;
u32 numGiftsReceived : 20;
u32 timesFlagTaken : 20;
u32 flagsRecovered : 20;
u32 timesBaseMoved : 20;
u32 capturedFlagCount : 20;
} UndergroundRecord;
typedef struct PlacedGood {
u8 x;
u8 z;
u8 goodID;
} PlacedGood;
typedef struct SecretBaseBoulder {
u8 x;
u8 z;
} SecretBaseBoulder;
typedef struct SecretBase {
PlacedGood placedGoods[MAX_PLACED_GOODS];
SecretBaseBoulder boulders[MAX_BASE_BOULDERS];
UndergroundRecord undergroundRecord;
u16 entranceX;
u16 entranceZ;
u8 entranceDir;
u8 active;
} SecretBase;
typedef struct Underground {
SecretBase secretBase;
u32 randomSeed;
s32 giftPenaltyMinutesLeft;
u8 giftPenaltyState;
u8 collectedOrbUnused; // Set but never read
u32 registeredFlagOwnerIDs[MAX_CAPTURED_FLAG_RECORDS];
charcode_t registeredFlagOwnerNames[MAX_CAPTURED_FLAG_RECORDS][TRAINER_NAME_LEN + 1];
u8 registeredFlagOwnerLanguages[MAX_CAPTURED_FLAG_RECORDS];
u8 registeredFlagOwnerGameCodes[MAX_CAPTURED_FLAG_RECORDS];
u8 registeredFlagOwnerIndex;
u8 spawnedTrapIDs[MAX_SPAWNED_TRAPS];
u8 spawnedTrapCoordinates[MAX_SPAWNED_TRAPS][CONDENSED_COORDS_BYTE_COUNT];
u8 miningSpotCoordinates[MAX_MINING_SPOTS + 5][CONDENSED_COORDS_BYTE_COUNT];
u8 placedTrapIDs[MAX_PLACED_TRAPS];
u8 placedTrapCoordinates[MAX_PLACED_TRAPS][CONDENSED_COORDS_BYTE_COUNT];
u8 placedTrapSpawnedIndices[MAX_PLACED_TRAPS]; // pointless field
u8 buriedSphereTypes[MAX_BURIED_SPHERES];
u8 buriedSphereGrowth[MAX_BURIED_SPHERES];
u8 buriedSphereInitialSizes[MAX_BURIED_SPHERES];
u8 buriedSphereCoordinates[MAX_BURIED_SPHERES][CONDENSED_COORDS_BYTE_COUNT];
u8 padding[88];
u32 minedPlates;
u8 goodsPC[MAX_GOODS_PC_SLOTS];
u8 traps[MAX_TRAP_SLOTS];
u8 goodsBag[MAX_GOODS_BAG_SLOTS];
u8 treasure[MAX_TREASURE_SLOTS];
u8 sphereTypes[MAX_SPHERE_SLOTS];
u8 sphereSizes[MAX_SPHERE_SLOTS];
u8 placedGoodSlots[MAX_PLACED_GOODS];
u8 stepCount;
u8 shouldSpawnNewBuriedObjects : 4;
u8 hasMined : 4;
} Underground;
enum BaseFlagType {
BASE_FLAG_NORMAL = 0,
BASE_FLAG_BRONZE,
BASE_FLAG_SILVER,
BASE_FLAG_GOLD,
BASE_FLAG_PLATINUM,
};
int Underground_SaveSize(void);
int SecretBase_Size(void);
int UndergroundRecord_Size(void);
UndergroundRecord *UndergroundRecord_Init(enum HeapID heapID);
void Underground_Init(Underground *underground);
void Underground_HandleDailyEvents(SaveData *saveData, int daysPassed);
void Underground_ProgressGiftPenalty(SaveData *saveData, s32 minutes, BOOL hasTimePenalty);
void Underground_UpdateGiftPenaltyState(SaveData *saveData);
void Underground_SetGiftPenaltyPrimedFlag(SaveData *saveData);
void Underground_ClearGiftPenaltyFlag(SaveData *saveData);
BOOL Underground_CanExchangeGifts(SaveData *saveData);
void Underground_SetUnusedCollectedOrbFlag(Underground *underground);
void Underground_StoreRegisteredFlagOwnerInfo(Underground *underground, const TrainerInfo *info);
TrainerInfo *Underground_GetRegisteredFlagOwnerInfo(const Underground *underground, enum HeapID heapID, int offset);
u32 Underground_GetRandomSeed(Underground *underground);
int Underground_ConvertTreasureToBagItem(int treasureID);
BOOL Underground_TryAddGoodPC(Underground *underground, enum Good goodID);
BOOL Underground_IsRoomForGoodsInPC(Underground *underground, int unused);
int Underground_GetGoodsCountPC(Underground *underground);
int Underground_GetGoodAtSlotPC(Underground *underground, int slot);
enum Good Underground_RemoveGoodAtSlotPC(Underground *underground, int slot);
void Underground_MoveGoodPC(Underground *underground, int origSlot, int slotToMoveAfter);
int Underground_AddPlacedGood(Underground *underground, int slot, int index);
BOOL Underground_IsGoodAtSlotPlacedInBase(Underground *underground, int slot);
void Underground_RemovePlacedGood(Underground *underground, int index);
void Underground_InitPlacedGoodSlots(Underground *underground);
int Underground_GetGoodsCountBag(Underground *underground);
int Underground_GetGoodAtSlotBag(Underground *underground, int slot);
int Underground_RemoveGoodAtSlotBag(Underground *underground, int slot);
BOOL Underground_TryAddGoodBag(Underground *underground, enum Good goodID);
void Underground_MoveGoodBag(Underground *underground, int origSlot, int slotToMoveAfter);
int Underground_GetSphereCount(Underground *underground);
int Underground_GetSphereTypeAtSlot(Underground *underground, int slot);
int Underground_GetSphereSizeAtSlot(Underground *underground, int slot);
int Underground_RemoveSphereAtSlot(Underground *underground, int slot);
BOOL Underground_TryAddSphere(Underground *underground, enum SphereType sphereType, int sphereSize);
void Underground_MoveSphereInInventory(Underground *underground, int origSlot, int slotToMoveAfter);
int Underground_GetTreasureCount(Underground *underground);
int Underground_GetTreasureAtSlot(Underground *underground, int slot);
int Underground_RemoveTreasureAtSlot(Underground *underground, int slot);
BOOL Underground_TryAddTreasure(Underground *underground, int treasureID);
void Underground_MoveTreasureInInventory(Underground *underground, int origSlot, int slotToMoveAfter);
int Underground_GetTrapCount(Underground *underground);
int Underground_GetTrapAtSlot(Underground *underground, int slot);
int Underground_RemoveTrapAtSlot(Underground *underground, int slot);
BOOL Underground_TryAddTrap(Underground *underground, enum Trap trapID);
void Underground_MoveTrapInInventory(Underground *underground, int origSlot, int slotToMoveAfter);
void Underground_SaveSpawnedTrap(Underground *underground, enum Trap trapID, int index, int x, int z);
int Underground_GetSpawnedTrapIDAtIndex(Underground *underground, int index);
int Underground_GetSpawnedTrapXCoordAtIndex(Underground *underground, int index);
int Underground_GetSpawnedTrapZCoordAtIndex(Underground *underground, int index);
void Underground_RemoveSpawnedTrapAtIndex(Underground *underground, int index);
void Underground_SavePlacedTrap(Underground *underground, enum Trap trapID, int index, int x, int z, int spawnedIndex);
int Underground_GetPlacedTrapIDAtIndex(Underground *underground, int index);
int Underground_GetPlacedTrapXCoordAtIndex(Underground *underground, int index);
int Underground_GetPlacedTrapZCoordAtIndex(Underground *underground, int index);
int Underground_GetPlacedTrapSpawnedIndexAtIndex(Underground *underground, int index);
void Underground_SaveBuriedSphere(Underground *underground, int type, int index, int x, int z, int initialSize, int growth);
int Underground_GetBuriedSphereTypeAtIndex(Underground *underground, int index);
int Underground_GetBuriedSphereXCoordAtIndex(Underground *underground, int index);
int Underground_GetBuriedSphereZCoordAtIndex(Underground *underground, int index);
int Underground_GetBuriedSphereInitialSizeAtIndex(Underground *underground, int index);
int Underground_GetBuriedSphereGrowthAtIndex(Underground *underground, int index);
int Underground_TryAddMiningSpot(Underground *underground, int x, int z);
void Underground_RemoveMiningSpotAtIndex(Underground *underground, int index);
int Underground_GetMiningSpotXCoordAtIndex(Underground *underground, int index);
int Underground_GetMiningSpotZCoordAtIndex(Underground *underground, int index);
BOOL Underground_HasPlayerNeverMined(Underground *underground);
void Underground_SetHasMined(Underground *underground);
BOOL Underground_ShouldSpawnNewBuriedObjects(Underground *underground);
void Underground_FlagSpawnedNewBuriedObjects(Underground *underground);
void Underground_SetPlateMined(Underground *underground, int miningItemID);
BOOL Underground_HasPlateNeverBeenMined(Underground *underground, int miningItemID);
void Underground_IncrementStepCount(Underground *underground);
int Underground_GetStepCount(Underground *underground);
void SecretBase_Init(SecretBase *secretBase);
void SecretBase_Clear(SecretBase *secretBase);
void SecretBase_SetInactive(SecretBase *secretBase);
void SecretBase_AddGoodAtIndex(SecretBase *secretBase, int index, enum Good goodID, int x, int z);
void SecretBase_SetGoodCoordsAtIndex(SecretBase *secretBase, int index, int x, int z);
int SecretBase_GetGoodIDAtIndex(const SecretBase *secretBase, int index);
int SecretBase_GetGoodXCoordAtIndex(const SecretBase *secretBase, int index);
int SecretBase_GetGoodZCoordAtIndex(const SecretBase *secretBase, int index);
int SecretBase_GetUnremovableBoulderCount(const SecretBase *secretBase);
int SecretBase_GetPlacedGoodsLimit(const SecretBase *secretBase);
int UndergroundRecord_GetTrainerScore(const UndergroundRecord *undergroundRecord);
BOOL UndergroundRecord_HasPlatBaseFlag(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_SetTrainerScore(UndergroundRecord *undergroundRecord, int trainerScore);
int UndergroundRecord_GetPeopleMet(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementPeopleMet(UndergroundRecord *undergroundRecord, int unused);
int UndergroundRecord_GetNumGiftsGiven(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementGiftsGiven(UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementFlagsStolen(UndergroundRecord *undergroundRecord);
enum BaseFlagType UndergroundRecord_GetFlagRank(const UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetCapturedFlagCount(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementCapturedFlagCount(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetNumSpheresDug(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_AddNumSpheresDug(UndergroundRecord *undergroundRecord, int amount);
int UndergroundRecord_GetNumFossilsDug(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_AddNumFossilsDug(UndergroundRecord *undergroundRecord, int amount);
void Underground_AddNumNonFossilsDug(UndergroundRecord *undergroundRecord, int amount);
int UndergroundRecord_GetNumTrapHits(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementNumTrapHits(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetNumTrapsTriggered(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementNumTrapsTriggered(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetNumPlayersHelped(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementNumPlayersHelped(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetGiftsReceived(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementGiftsReceived(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetTimesFlagTaken(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementTimesFlagTaken(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetFlagsRecovered(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementFlagsRecovered(UndergroundRecord *undergroundRecord);
int UndergroundRecord_GetTimesBaseMoved(const UndergroundRecord *undergroundRecord);
void UndergroundRecord_IncrementTimesBaseMoved(UndergroundRecord *undergroundRecord);
void SecretBase_SetEntrance(SecretBase *secretBase, int x, int z, int dir);
int SecretBase_GetEntranceXCoord(const SecretBase *secretBase);
int SecretBase_GetEntranceZCoord(const SecretBase *secretBase);
int SecretBase_GetEntranceDir(const SecretBase *secretBase);
BOOL SecretBase_IsActive(const SecretBase *secretBase);
SecretBase *SaveData_GetSecretBase(SaveData *saveData);
UndergroundRecord *SaveData_GetUndergroundRecord(SaveData *saveData);
UndergroundRecord *SecretBase_GetUndergroundRecord(SecretBase *secretBase);
Underground *SaveData_GetUnderground(SaveData *saveData);
#endif // POKEPLATINUM_UNDERGROUND_H