pokediamond/include/map_object.h
red031000 a5cdb5e2b8
more
2024-05-10 10:24:49 +01:00

132 lines
4.5 KiB
C

#ifndef POKEDIAMOND_MAP_OBJECT_H
#define POKEDIAMOND_MAP_OBJECT_H
#include "global.h"
#include "field_system.h"
#include "heap.h"
typedef struct SavedMapObject {
u32 flags;
u32 flags2;
u8 objId;
u8 movement;
s8 xRange;
s8 yRange;
s8 initialFacing;
s8 currentFacing;
s8 nextFacing;
u16 unk10;
u16 spriteId;
u16 type;
u16 flagId;
u16 script;
s16 param[3];
s16 initialX;
s16 initialHeight;
s16 initialY;
s16 currentX;
s16 currentHeight;
s16 currentY;
fx32 vecY;
u8 unk30[16];
u8 unk40[16];
} SavedMapObject;
typedef struct LocalMapObject {
u8 padding[0x128]; //todo verify size
} LocalMapObject;
typedef struct ObjectEvent
{
u8 padding[0x8];
u16 flag;
u8 padding2[0x16];
//todo fill out
//todo this should be in map_events_internal.h
} ObjectEvent;
typedef void (*LocalMapObject_UnkCallback)(LocalMapObject* object);
typedef enum MapObjectFlagBits {
MAPOBJECTFLAG_ACTIVE = (1 << 0),
MAPOBJECTFLAG_SINGLE_MOVEMENT = (1 << 1),
MAPOBJECTFLAG_UNK2 = (1 << 2),
MAPOBJECTFLAG_UNK3 = (1 << 3),
MAPOBJECTFLAG_UNK4 = (1 << 4),
MAPOBJECTFLAG_UNK5 = (1 << 5),
MAPOBJECTFLAG_MOVEMENT_PAUSED = (1 << 6),
MAPOBJECTFLAG_UNK7 = (1 << 7),
MAPOBJECTFLAG_UNK8 = (1 << 8),
MAPOBJECTFLAG_VISIBLE = (1 << 9),
MAPOBJECTFLAG_UNK10 = (1 << 10),
MAPOBJECTFLAG_UNK11 = (1 << 11),
MAPOBJECTFLAG_UNK12 = (1 << 12),
MAPOBJECTFLAG_UNK13 = (1 << 13),
MAPOBJECTFLAG_UNK14 = (1 << 14),
MAPOBJECTFLAG_UNK15 = (1 << 15),
MAPOBJECTFLAG_UNK16 = (1 << 16),
MAPOBJECTFLAG_UNK17 = (1 << 17),
MAPOBJECTFLAG_UNK18 = (1 << 18),
MAPOBJECTFLAG_UNK19 = (1 << 19),
MAPOBJECTFLAG_UNK20 = (1 << 20),
MAPOBJECTFLAG_UNK21 = (1 << 21),
MAPOBJECTFLAG_UNK22 = (1 << 22),
MAPOBJECTFLAG_IGNORE_HEIGHTS = (1 << 23),
MAPOBJECTFLAG_UNK24 = (1 << 24),
MAPOBJECTFLAG_UNK25 = (1 << 25),
MAPOBJECTFLAG_UNK26 = (1 << 26),
MAPOBJECTFLAG_UNK27 = (1 << 27),
MAPOBJECTFLAG_UNK28 = (1 << 28),
MAPOBJECTFLAG_UNK29 = (1 << 29),
MAPOBJECTFLAG_UNK30 = (1 << 30),
MAPOBJECTFLAG_UNK31 = (1 << 31),
} MapObjectFlagBits;
#define MAP_OBJECT_GFX_ID_INVALID 0xFFFF
typedef struct MapObjectInitArgs {
u32 mapNo;
int objectEventCount;
int index;
MapObjectManager *manager;
ObjectEvent *objectEvents;
} MapObjectInitArgs;
typedef struct UnkLMOCallbackStruct {
u32 unk0;
LocalMapObject_UnkCallback unk4;
LocalMapObject_UnkCallback unk8;
LocalMapObject_UnkCallback unkC;
LocalMapObject_UnkCallback unk10;
} UnkLMOCallbackStruct;
typedef struct UnkLMOCallbackStruct2 {
LocalMapObject_UnkCallback unk0;
LocalMapObject_UnkCallback unk4;
LocalMapObject_UnkCallback unk8;
LocalMapObject_UnkCallback unkC;
LocalMapObject_UnkCallback unk10;
} UnkLMOCallbackStruct2;
MapObjectManager *MapObjectManager_Init(FieldSystem *fieldSystem, u32 objectCount, u32 priority);
void MapObjectManager_Delete(MapObjectManager *manager);
void sub_020573C8(MapObjectManager *manager, u32 unused, u32 flagId, u32 objectCount, ObjectEvent *objectEvents);
LocalMapObject *MapObject_Create(MapObjectManager *manager, u32 x, u32 y, u32 direction, u32 sprite, u32 movement, u32 mapNo);
LocalMapObject *MapObject_CreateFromObjectEventWithId(MapObjectManager *manager, u16 id, u32 objectEventCount, u32 mapNo, const ObjectEvent *events);
void sub_02057614(LocalMapObject *object, u32 sprite);
void sub_02057634(LocalMapObject *object, u32 sprite);
void MapObject_Remove(LocalMapObject *object);
void MapObject_Delete(LocalMapObject *object);
void sub_020576A8(LocalMapObject *object);
void MapObjectManager_RemoveAllActiveObjects(MapObjectManager *manager);
void sub_02057750(MapObjectManager *manager);
void sub_020577A8(MapObjectManager *manager);
void FieldSystem_SyncMapObjectsToSaveEx(FieldSystem *fieldSystem, MapObjectManager *manager, SavedMapObject *savedObjects, s32 count);
void MapObjectManager_RestoreFromSave(MapObjectManager *manager, SavedMapObject *savedObjects, u32 objectCount);
void MapObject_CreateFromMultipleObjectEvents(MapObjectManager *manager, u32 mapNo, u32 objectEventCount, ObjectEvent *objectEvents);
LocalMapObject *MapObjectManager_GetFirstActiveObjectByID(MapObjectManager *manager, u32 id);
LocalMapObject *MapObjectManager_GetFirstActiveObjectWithMovement(MapObjectManager *manager, u32 movement);
BOOL MapObjectManager_GetNextObjectWithFlagFromIndex(MapObjectManager *manager, LocalMapObject **objectDest, s32 *index, MapObjectFlagBits flag);
#endif //POKEDIAMOND_MAP_OBJECT_H