diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index 55650103..3e4df24f 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -199,7 +199,7 @@ HuSprDispInit = .text:0x8000F6A0; // type:function size:0x158 HuSprDisp = .text:0x8000F7F8; // type:function size:0xECC HuSprTexLoad = .text:0x800106C4; // type:function size:0x29C HuSprExecLayerSet = .text:0x80010960; // type:function size:0x58 -HuSprLayerHook = .text:0x800109B8; // type:function size:0x178 +HuSprLayerHook = .text:0x800109B8; // type:function size:0x178 scope:local LoadHSF = .text:0x80010B30; // type:function size:0xB0 ClusterAdjustObject = .text:0x80010BE0; // type:function size:0xA0 FileLoad = .text:0x80010C80; // type:function size:0xC8 scope:local diff --git a/include/REL/w10Dll.h b/include/REL/w10Dll.h index faf94109..2dd77653 100644 --- a/include/REL/w10Dll.h +++ b/include/REL/w10Dll.h @@ -1,12 +1,14 @@ #include "common.h" +#include "dolphin.h" #include "REL/executor.h" +#include "game/process.h" #define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0])) typedef struct unkw10Dll { - Vec3f unk0; - Vec3f unk0C; - Vec3f unk18; + Vec unk0; + Vec unk0C; + Vec unk18; s32 unk24; } unkw10Dll; //sizeof 0x28 @@ -23,9 +25,6 @@ typedef struct m456DllUnk02 { w10DllUnk01* unk5C; } m456DllUnk02; //sizeof ? -//this belongs to m456Dll -m456DllUnk02** fn_8002FAC0(Process*, s32); - typedef struct w10DllUnk03 { s16 unk0; s16 unk2; @@ -103,7 +102,7 @@ void fn_1_137C(void); extern w10DllUnk04 lbl_1_data_108[42]; extern w10DllUnk03 lbl_1_data_C6[]; -extern Vec3f lbl_1_data_80[]; +extern Vec lbl_1_data_80[]; extern Process* lbl_1_bss_18; extern s16 lbl_1_bss_1C; extern s16 lbl_1_bss_1E; diff --git a/include/common.h b/include/common.h index a77b1cb9..4875c13a 100644 --- a/include/common.h +++ b/include/common.h @@ -3,10 +3,7 @@ #include "types.h" #include "common_structs.h" -#include "common_enums.h" #include "functions.h" #include "variables.h" -#include "dolphin/mtx/GeoTypes.h" -#include "dolphin/mtx.h" #endif \ No newline at end of file diff --git a/include/common_enums.h b/include/common_enums.h deleted file mode 100644 index 120538db..00000000 --- a/include/common_enums.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _COMMON_ENUMS_H -#define _COMMON_ENUMS_H - -#include "types.h" - -#define OVL_DEFINE(name, path) name, - -typedef enum { - OVL_INVALID = -1, - #include "ovl_table.h" - OVL_COUNT -} OverlayID; - -#undef OVL_DEFINE - -#define DATADIR_DEFINE(name, path) name, - -typedef enum { - #include "datadir_table.h" - DATADIR_COUNT -} DataDirID; - -#undef DATADIR_DEFINE - - -typedef enum { - HEAP_SYSTEM, - HEAP_MUSIC, - HEAP_DATA, - HEAP_DVD, - HEAP_MISC, - HEAP_MAX -} HeapID; - -#endif \ No newline at end of file diff --git a/include/common_structs.h b/include/common_structs.h index f9428907..7d7f06a7 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -2,56 +2,10 @@ #define _COMMON_STRUCTS_H #include "types.h" -#include "common_enums.h" #include "dolphin/dvd.h" #include "dolphin/mtx/GeoTypes.h" #include "dolphin/gx/GXEnum.h" -typedef struct om_ovl_his_data { - OverlayID overlay; - int event; - int stat; -} omOvlHisData; - -typedef struct Vec2f { - f32 x; - f32 y; -} Vec2f; - -typedef struct Vec3f { - f32 x; - f32 y; - f32 z; -} Vec3f; - -typedef struct jump_buf { - u32 lr; - u32 cr; - u32 sp; - u32 r2; - u32 pad; - u32 regs[19]; - double flt_regs[19]; -} jmp_buf; - -typedef struct process { - struct process *next; - struct process *prev; - struct process *child; - struct process *parent; - struct process *next_child; - struct process *first_child; - void *heap; - u16 exec; - u16 stat; - u16 prio; - s32 sleep_time; - u32 base_sp; - jmp_buf jump; - void (*dtor)(void); - void *user_data; -} Process; - typedef struct player_config { s16 character; s16 pad_idx; @@ -66,23 +20,6 @@ typedef struct wipe_state { u8 unk2[20]; } WipeState; -typedef struct file_list_entry { - char *name; - s32 file_id; -} FileListEntry; - -typedef struct data_read_stat { - s32 dir_id; - void *dir; - void *file; - u32 raw_len; - u32 comp_type; - BOOL used; - s32 num; - u32 status; - DVDFileInfo file_info; -} DataReadStat; - typedef struct BoardStateSubStruct { /* 0x00 */ s32 unk0; /* 0x04 */ u16 unk4; @@ -137,142 +74,4 @@ typedef struct player_state { /* 0x2C */ char unk_2C[4]; } PlayerState; //size of 0x30 -typedef struct om_obj_data { - u16 stat; - s16 next_idx_alloc; - s16 prio; - s16 prev; - s16 next; - s16 next_idx; - s16 group; - u16 group_idx; - int unk10; - void (*func)(struct om_obj_data *); - Vec3f trans; - Vec3f rot; - Vec3f scale; - u16 mdlcnt; - s16 *model; - u16 mtncnt; - s16 *motion; - int work[4]; - void *data; -} omObjData; - -typedef struct anim_frame_data { - s16 pat; - s16 time; - s16 shiftX; - s16 shiftY; - s16 flip; - s16 pad; -} AnimFrameData; - -typedef struct anim_bank_data { - s16 timeNum; - s16 unk; - AnimFrameData *frame; -} AnimBankData; - -typedef struct anim_layer_data { - u8 alpha; - u8 flip; - s16 bmpNo; - s16 startX; - s16 startY; - s16 sizeX; - s16 sizeY; - s16 shiftX; - s16 shiftY; - s16 vtx[8]; -} AnimLayerData; - -typedef struct anim_pat_data { - s16 layerNum; - s16 centerX; - s16 centerY; - s16 sizeX; - s16 sizeY; - AnimLayerData *layer; -} AnimPatData; - -typedef struct anim_bmp_data { - u8 pixSize; - u8 dataFmt; - s16 palNum; - s16 sizeX; - s16 sizeY; - u32 dataSize; - void *palData; - void *data; -} AnimBmpData; - -typedef struct anim_data { - s16 bankNum; - s16 patNum; - s16 bmpNum; - s16 useNum; - AnimBankData *bank; - AnimPatData *pat; - AnimBmpData *bmp; -} AnimData; - -typedef struct sprite_data { - u8 r; - u8 g; - u8 b; - char draw_no; - short frame; - short bank; - short attr; - short dirty_flag; - short prio; - float time; - float x; - float y; - float z_rot; - float scale_x; - float scale_y; - float speed; - float a; - GXTexWrapMode wrap_s; - GXTexWrapMode wrap_t; - short tex_scale_x; - short tex_scale_y; - Mtx *group_mtx; - union { - AnimData *data; - void (*func)(struct sprite_data *sprite); - }; - AnimPatData *pat_data; - AnimFrameData *frame_data; - short work[4]; - AnimData *bg; - unsigned short bg_bank; - short scissor_x; - short scissor_y; - short scissor_w; - short scissor_h; -} SpriteData; - -typedef struct sprite_group_data { - short capacity; - float x; - float y; - float z_rot; - float scale_x; - float scale_y; - float center_x; - float center_y; - short *members; - Mtx mtx; -} SpriteGroupData; - -typedef struct sprite_order_data { - unsigned short group; - unsigned short sprite; - unsigned short prio; - unsigned short next; -} SpriteOrderData; - #endif diff --git a/include/dolphin.h b/include/dolphin.h new file mode 100644 index 00000000..bf374a42 --- /dev/null +++ b/include/dolphin.h @@ -0,0 +1,19 @@ +#ifndef __DOLPHIN_H__ +#define __DOLPHIN_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif \ No newline at end of file diff --git a/include/functions.h b/include/functions.h index 7868a1da..58eac1e9 100644 --- a/include/functions.h +++ b/include/functions.h @@ -3,12 +3,11 @@ #include "types.h" #include "common_structs.h" -#include "common_enums.h" #include "dolphin/mtx.h" #include "dolphin/gx/GXStruct.h" void Hu3DLayerHookSet(short layer, void (*func)(short layer)); -void Hu3D2Dto3D(Vec3f*, s32, Vec3f*); +void Hu3D2Dto3D(Vec*, s32, Vec*); void Hu3DModelLightInfoSet(s32, s32); void Hu3DBGColorSet(u8, u8, u8); void Hu3DCameraCreate(s16); @@ -20,134 +19,9 @@ s32 fn_800578E4(void); void HuAudFadeOut(int arg0); void fn_80035A0C(void); -void HuDecodeData(void *src, void *dst, u32 size, int decode_type); - -void HuMemInitAll(void); -void *HuMemInit(void *ptr, s32 size); -void HuMemDCFlushAll(); -void HuMemDCFlush(HeapID heap); -void *HuMemDirectMalloc(HeapID heap, s32 size); -void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num); -void HuMemDirectFree(void *ptr); -void HuMemDirectFreeNum(HeapID heap, u32 num); -s32 HuMemUsedMallocSizeGet(HeapID heap); -s32 HuMemUsedMallocBlockGet(HeapID heap); -u32 HuMemHeapSizeGet(HeapID heap); -void *HuMemHeapPtrGet(HeapID heap); - -void *HuMemHeapInit(void *ptr, s32 size); -void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr); -void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, u32 retaddr); -void HuMemMemoryFree(void *ptr, u32 retaddr); -void HuMemMemoryFreeNum(void *heap_ptr, u32 num, u32 retaddr); -s32 HuMemUsedMemorySizeGet(void *heap_ptr); -s32 HuMemUsedMemoryBlockGet(void *heap_ptr); -s32 HuMemMemoryAllocSizeGet(s32 size); -void HuMemHeapDump(void *heap_ptr, s16 status); - -void HuPrcInit(void); -void HuPrcEnd(void); -Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size); -void HuPrcChildLink(Process *parent, Process *child); -void HuPrcChildUnlink(Process *process); -Process *HuPrcChildCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size, Process *parent); -void HuPrcChildWatch(); -Process *HuPrcCurrentGet(void); -int HuPrcKill(Process *process); -void HuPrcChildKill(Process *process); -void HuPrcSleep(s32 time); -void HuPrcVSleep(void); -void HuPrcWakeup(Process *process); -void HuPrcDestructorSet2(Process *process, void (*func)(void)); -void HuPrcDestructorSet(void (*func)(void)); -void HuPrcCall(int tick); -void *HuPrcMemAlloc(s32 size); -void HuPrcMemFree(void *ptr); -void HuPrcSetStat(Process *process, u16 value); -void HuPrcResetStat(Process *process, u16 value); -void HuPrcAllPause(int flag); -void HuPrcAllUPause(int flag); - -void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl); -void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat); -void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat); -void omOvlReturnEx(s16 level, s16 arg2); -void omOvlKill(s16 arg); -void omOvlHisChg(s32 level, OverlayID overlay, int event, int stat); -omOvlHisData *omOvlHisGet(s32 level); -Process *omInitObjMan(s16 max_objs, int prio); -void omDestroyObjMan(void); -omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, s16 group, void (*func)(omObjData *)); -void omAddMember(Process *objman_process, u16 group, omObjData *object); -void omDelObjEx(Process *objman_process, omObjData *object); -void omDelMember(Process *objman_process, omObjData *object); -void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs); -omObjData **omGetGroupMemberListEx(Process *objman_process, s16 group); -void omSetStatBit(omObjData *obj, u16 stat); -void omResetStatBit(omObjData *obj, u16 stat); -void omSetTra(omObjData *obj, float x, float y, float z); -void omSetRot(omObjData *obj, float x, float y, float z); -void omSetSca(omObjData *obj, float x, float y, float z); -void omMain(void); -void omAllPause(BOOL pause); -char omPauseChk(void); -OverlayID omCurrentOvlGet(void); - - -void omDLLDBGOut(void); -void omDLLInit(FileListEntry *ovl_list); -int omDLLStart(s16 ovl, s16 dll); -void omDLLNumEnd(s16 ovl, s16 arg2); - -void omSysPauseEnable(BOOL flag); - - void WipeCreate(char dir, char type, short duration); u8 WipeStatGet(void); -void pfInit(void); -void pfClsScr(void); -s16 print8(s16 x, s16 y, float scale, char *str, ...); -s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color); -void pfDrawFonts(void); - -void *HuDvdDataRead(char *path); -void **HuDvdDataReadMulti(char **paths); -void *HuDvdDataReadDirect(char *path, HeapID heap); -void *HuDvdDataFastRead(s32 entrynum); -void *HuDvdDataFastReadNum(s32 entrynum, s32 num); -void *HuDvdDataFastReadAsync(s32 entrynum, DataReadStat *stat); -void HuDvdDataClose(void *ptr); -void HuDvdErrorWatch(); - -void HuDataInit(void); -int HuDataReadChk(s32 data_num); -DataReadStat *HuDataGetStatus(void *dir_ptr); -void *HuDataGetDirPtr(s32 data_num); -DataReadStat *HuDataDirRead(s32 data_num); -DataReadStat *HuDataDirReadNum(s32 data_num, s32 num); -DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num); -void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo); -s32 HuDataDirReadAsync(s32 data_num); -s32 HuDataDirReadNumAsync(s32 data_num, s32 num); -BOOL HuDataGetAsyncStat(s32 status); -void *HuDataRead(s32 data_num); -void *HuDataReadNum(s32 data_num, s32 num); -void *HuDataSelHeapRead(s32 data_num, HeapID heap); -void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap); -void **HuDataReadMulti(s32 *data_ids); -s32 HuDataGetSize(s32 data_num); -void HuDataClose(void *ptr); -void HuDataCloseMulti(void **ptrs); -void HuDataDirClose(s32 data_id); -void HuDataDirCloseNum(s32 num); -void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap); - -void *HuARDirCheck(s32 dir); -void HuAR_ARAMtoMRAM(void *dst); -void HuAR_ARAMtoMRAMNum(void *dst, s32 num); -BOOL HuARDMACheck(); - void Hu3DModelPosSet(s16 index, float x, float y, float z); void Hu3DModelRotSet(s16 index, float x, float y, float z); void Hu3DModelScaleSet(s16 index, float x, float y, float z); @@ -160,51 +34,6 @@ void espKill(s16); void espDispOn(s16); void espPosSet(s16, f32, f32); -void HuSprInit(void); -void HuSprClose(void); -void HuSprExec(short draw_no); -void HuSprBegin(void); -SpriteData *HuSprCall(void); -void HuSprFinish(void); -void HuSprPauseSet(BOOL value); -AnimData *HuSprAnimRead(void *data); -void HuSprAnimLock(AnimData *anim); -short HuSprCreate(AnimData *anim, short prio, short bank); -short HuSprFuncCreate(void (*func)(SpriteData *sprite), short prio); -short HuSprGrpCreate(short capacity); -short HuSprGrpCopy(short group); -void HuSprGrpMemberSet(short group, short member, short sprite); -void HuSprGrpMemberKill(short group, short member); -void HuSprGrpKill(short group); -void HuSprKill(short sprite); -void HuSprAnimKill(AnimData *anim); -void HuSprAttrSet(short group, short member, int attr); -void HuSprAttrReset(short group, short member, int attr); -void HuSprPosSet(short group, short member, float x, float y); -void HuSprZRotSet(short group, short member, float z_rot); -void HuSprScaleSet(short group, short member, float x, float y); -void HuSprTPLvlSet(short group, short member, float tp_lvl); -void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b); -void HuSprSpeedSet(short group, short member, float speed); -void HuSprBankSet(short group, short member, short bank); -void HuSprGrpPosSet(short group, float x, float y); -void HuSprGrpCenterSet(short group, float x, float y); -void HuSprGrpZRotSet(short group, float z_rot); -void HuSprGrpScaleSet(short group, float x, float y); -void HuSprGrpTPLvlSet(short group, float tp_lvl); -void HuSprGrpDrawNoSet(short group, int draw_no); -void HuSprDrawNoSet(short group, short member, int draw_no); -void HuSprPriSet(short group, short member, short prio); -void HuSprGrpScissorSet(short group, short x, short y, short w, short h); -void HuSprScissorSet(short group, short member, short x, short y, short w, short h); -AnimData *HuSprAnimMake(short sizeX, short sizeY, short dataFmt); -void HuSprBGSet(short group, short member, AnimData *bg, short bg_bank); -void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank); -void AnimDebug(AnimData *anim); -void HuSprDispInit(void); -void HuSprDisp(SpriteData *sprite); -void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, GXTexWrapMode wrap_t, GXTexFilter filter); - void HuWinAllKill(void); void HuWinMesSet(s16, s32); void HuWinKill(s16); @@ -235,9 +64,9 @@ void BoardMessWait(void); s32 rand8(void); void fn_8005D8E8(void); -void fn_8005DB6C(s16, Vec3f*, s32, f32, f32, s32); +void fn_8005DB6C(s16, Vec*, s32, f32, f32, s32); void fn_8005E0C0(void); -void fn_80074210(s32, s32, Vec3f*); +void fn_80074210(s32, s32, Vec*); void fn_8007A360(s32); void fn_8007F894(void); void fn_80083F84(void); @@ -256,7 +85,7 @@ void fn_8006F61C(s16, s32); void fn_800B42BC(s16); s32 fn_8006DBD4(s16); void fn_8005B150(void*, void*); -void fn_8006F2E8(s32, Vec3f*); +void fn_8006F2E8(s32, Vec*); void fn_8005D10C(void*, void*); s16 fn_8006D9A4(s32, void*, s32); void fn_8006DB90(s16); @@ -265,7 +94,7 @@ void fn_8006E2B8(s16, s32, s32); void fn_8006E878(s16, f32); void fn_8006F158(s16, void*); void fn_8006F1A8(s16, f32, f32, f32); -s32 fn_8006F220(s16 arg0, Vec3f* arg1); +s32 fn_8006F220(s16 arg0, Vec* arg1); void fn_8006F50C(s16, s32); void fn_80073FF4(void*); void fn_80073FFC(void*); @@ -279,7 +108,7 @@ void fn_80083EDC(s16); void fn_800A4F6C(s16); void fn_800B3FD8(void*); void fn_800B4274(s32, s32); -void fn_8005D5C0(Vec3f*); +void fn_8005D5C0(Vec*); void fn_8006F338(s16, f32, f32, f32); s32 fn_8005B6A8(void); void fn_8006EFBC(s16, Mtx); diff --git a/include/game/data.h b/include/game/data.h new file mode 100644 index 00000000..e59ede63 --- /dev/null +++ b/include/game/data.h @@ -0,0 +1,72 @@ +#ifndef _GAME_DATA_H +#define _GAME_DATA_H + +#include "game/dvd.h" + +#define DATA_DECODE_NONE 0 +#define DATA_DECODE_LZ 1 +#define DATA_DECODE_SLIDE 2 +#define DATA_DECODE_FSLIDE_ALT 3 +#define DATA_DECODE_FSLIDE 4 +#define DATA_DECODE_RLE 5 + +#define MAKE_DATA_NUM(dir, file) (((dir) << 16)+(file)) +#define MAKE_DIR_NUM(dir) ((dir) << 16) + +#define DATA_NUM_LISTEND -1 + +#include "dolphin/types.h" + +#define DATADIR_DEFINE(name, path) name, + +typedef enum { + #include "datadir_table.h" + DATADIR_COUNT +} DataDirID; + +#undef DATADIR_DEFINE + +typedef struct data_read_stat { + s32 dir_id; + void *dir; + void *file; + u32 raw_len; + u32 comp_type; + BOOL used; + s32 num; + u32 status; + DVDFileInfo file_info; +} DataReadStat; + +void HuDataInit(void); +int HuDataReadChk(s32 data_num); +DataReadStat *HuDataGetStatus(void *dir_ptr); +void *HuDataGetDirPtr(s32 data_num); +DataReadStat *HuDataDirRead(s32 data_num); +DataReadStat *HuDataDirReadNum(s32 data_num, s32 num); +DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num); +void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo); +s32 HuDataDirReadAsync(s32 data_num); +s32 HuDataDirReadNumAsync(s32 data_num, s32 num); +BOOL HuDataGetAsyncStat(s32 status); +void *HuDataRead(s32 data_num); +void *HuDataReadNum(s32 data_num, s32 num); +void *HuDataSelHeapRead(s32 data_num, HeapID heap); +void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap); +void **HuDataReadMulti(s32 *data_ids); +s32 HuDataGetSize(s32 data_num); +void HuDataClose(void *ptr); +void HuDataCloseMulti(void **ptrs); +void HuDataDirClose(s32 data_id); +void HuDataDirCloseNum(s32 num); +void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap); + +void HuDecodeData(void *src, void *dst, u32 size, int decode_type); + +void *HuARDirCheck(s32 dir); +void HuAR_ARAMtoMRAM(void *dst); +void HuAR_ARAMtoMRAMNum(void *dst, s32 num); +BOOL HuARDMACheck(); + + +#endif \ No newline at end of file diff --git a/include/game/dvd.h b/include/game/dvd.h new file mode 100644 index 00000000..7e7fa382 --- /dev/null +++ b/include/game/dvd.h @@ -0,0 +1,24 @@ +#ifndef _GAME_DVD_H +#define _GAME_DVD_H + +#include "dolphin.h" +#include "game/memory.h" + +typedef struct data_read_stat DataReadStat; + +typedef struct file_list_entry { + char *name; + s32 file_id; +} FileListEntry; + +void *HuDvdDataRead(char *path); +void **HuDvdDataReadMulti(char **paths); +void *HuDvdDataReadDirect(char *path, HeapID heap); +void *HuDvdDataFastRead(s32 entrynum); +void *HuDvdDataFastReadNum(s32 entrynum, s32 num); +void *HuDvdDataFastReadAsync(s32 entrynum, DataReadStat *stat); +void HuDvdDataClose(void *ptr); +void HuDvdErrorWatch(); + + +#endif \ No newline at end of file diff --git a/include/game/init.h b/include/game/init.h new file mode 100644 index 00000000..6eb51287 --- /dev/null +++ b/include/game/init.h @@ -0,0 +1,20 @@ +#ifndef _GAME_INIT_H +#define _GAME_INIT_H + +#include "dolphin.h" + +extern GXRenderModeObj *RenderMode; +extern OSHeapHandle currentHeapHandle; + +extern void *DemoFrameBuffer1; +extern void *DemoFrameBuffer2; +extern void *DemoCurrentBuffer; +extern u32 minimumVcount; +extern float minimumVcountf; +extern u32 worstVcount; + +void HuSysInit(GXRenderModeObj *mode); +void HuSysBeforeRender(); +void HuSysDoneRender(s32 retrace_count); + +#endif \ No newline at end of file diff --git a/include/game/memory.h b/include/game/memory.h new file mode 100644 index 00000000..52269a8e --- /dev/null +++ b/include/game/memory.h @@ -0,0 +1,40 @@ +#ifndef _GAME_MEMORY_H +#define _GAME_MEMORY_H + +#include "dolphin/types.h" + +#define MEMORY_DEFAULT_NUM 0x10000000 + +typedef enum { + HEAP_SYSTEM, + HEAP_MUSIC, + HEAP_DATA, + HEAP_DVD, + HEAP_MISC, + HEAP_MAX +} HeapID; + +void HuMemInitAll(void); +void *HuMemInit(void *ptr, s32 size); +void HuMemDCFlushAll(); +void HuMemDCFlush(HeapID heap); +void *HuMemDirectMalloc(HeapID heap, s32 size); +void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num); +void HuMemDirectFree(void *ptr); +void HuMemDirectFreeNum(HeapID heap, u32 num); +s32 HuMemUsedMallocSizeGet(HeapID heap); +s32 HuMemUsedMallocBlockGet(HeapID heap); +u32 HuMemHeapSizeGet(HeapID heap); +void *HuMemHeapPtrGet(HeapID heap); + +void *HuMemHeapInit(void *ptr, s32 size); +void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr); +void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, u32 retaddr); +void HuMemMemoryFree(void *ptr, u32 retaddr); +void HuMemMemoryFreeNum(void *heap_ptr, u32 num, u32 retaddr); +s32 HuMemUsedMemorySizeGet(void *heap_ptr); +s32 HuMemUsedMemoryBlockGet(void *heap_ptr); +s32 HuMemMemoryAllocSizeGet(s32 size); +void HuMemHeapDump(void *heap_ptr, s16 status); + +#endif \ No newline at end of file diff --git a/include/game/object.h b/include/game/object.h new file mode 100644 index 00000000..135cdfc2 --- /dev/null +++ b/include/game/object.h @@ -0,0 +1,103 @@ +#ifndef _GAME_OBJECT_H +#define _GAME_OBJECT_H + +#include "dolphin.h" +#include "game/process.h" +#include "game/dvd.h" + +#define OVL_DEFINE(name, path) name, + +typedef enum { + OVL_INVALID = -1, + #include "ovl_table.h" + OVL_COUNT +} OverlayID; + +#undef OVL_DEFINE + +#define OM_STAT_DELETED 0x1 +#define OM_STAT_DISABLED 0x2 +#define OM_STAT_ACTIVE 0x4 +#define OM_STAT_PAUSED 0x10 +#define OM_STAT_NOPAUSE 0x20 +#define OM_STAT_MODEL_PAUSED 0x100 + +typedef void (*omObjFunc)(struct om_obj_data *); + +typedef struct om_ovl_his_data { + OverlayID overlay; + int event; + int stat; +} omOvlHisData; + +typedef struct om_obj_data { + u16 stat; + s16 next_idx_alloc; + s16 prio; + s16 prev; + s16 next; + s16 next_idx; + s16 group; + u16 group_idx; + int unk10; + omObjFunc func; + Vec trans; + Vec rot; + Vec scale; + u16 mdlcnt; + s16 *model; + u16 mtncnt; + s16 *motion; + int work[4]; + void *data; +} omObjData; + +void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl); +void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat); +void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat); +void omOvlReturnEx(s16 level, s16 arg2); +void omOvlKill(s16 arg); +void omOvlHisChg(s32 level, OverlayID overlay, int event, int stat); +omOvlHisData *omOvlHisGet(s32 level); +Process *omInitObjMan(s16 max_objs, int prio); +void omDestroyObjMan(void); +omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, s16 group, omObjFunc func); +void omAddMember(Process *objman_process, u16 group, omObjData *object); +void omDelObjEx(Process *objman_process, omObjData *object); +void omDelMember(Process *objman_process, omObjData *object); +void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs); +omObjData **omGetGroupMemberListEx(Process *objman_process, s16 group); +void omSetStatBit(omObjData *obj, u16 stat); +void omResetStatBit(omObjData *obj, u16 stat); +void omSetTra(omObjData *obj, float x, float y, float z); +void omSetRot(omObjData *obj, float x, float y, float z); +void omSetSca(omObjData *obj, float x, float y, float z); +void omMain(void); +void omAllPause(BOOL pause); +char omPauseChk(void); +OverlayID omCurrentOvlGet(void); + + +void omDLLDBGOut(void); +void omDLLInit(FileListEntry *ovl_list); +int omDLLStart(s16 ovl, s16 dll); +void omDLLNumEnd(s16 ovl, s16 arg2); + +void omSysPauseEnable(BOOL flag); + +extern omObjData *omDBGSysKeyObj; +extern Process *omwatchproc; +extern OverlayID omnextovl; +extern OverlayID omcurovl; +extern int omcurdll; +extern int omovlhisidx; +extern int omovlevtno; +extern int omnextovlevtno; +extern int omovlstat; +extern char omUPauseFlag; +extern s16 omSysExitReq; +extern s16 omdispinfo; +extern char omSysPauseEnableFlag; +extern OverlayID omprevovl; + +#endif \ No newline at end of file diff --git a/include/game/printfunc.h b/include/game/printfunc.h new file mode 100644 index 00000000..9587aa6a --- /dev/null +++ b/include/game/printfunc.h @@ -0,0 +1,35 @@ +#ifndef _GAME_PRINTFUNC_H +#define _GAME_PRINTFUNC_H + +#include "dolphin.h" + +#define FONT_COLOR_BLACK 0 +#define FONT_COLOR_DARK_BLUE 1 +#define FONT_COLOR_DARK_RED 2 +#define FONT_COLOR_DARK_MAGENTA 3 +#define FONT_COLOR_DARK_GREEN 4 +#define FONT_COLOR_DARK_CYAN 5 +#define FONT_COLOR_DARK_YELLOW 6 +#define FONT_COLOR_GRAY 7 +#define FONT_COLOR_TRANSLUCENT_GRAY 8 +#define FONT_COLOR_BLUE 9 +#define FONT_COLOR_RED 10 +#define FONT_COLOR_MAGENTA 11 +#define FONT_COLOR_GREEN 12 +#define FONT_COLOR_CYAN 13 +#define FONT_COLOR_YELLOW 14 +#define FONT_COLOR_WHITE 15 + +void pfInit(void); +void pfClsScr(void); +s16 print8(s16 x, s16 y, float scale, char *str, ...); +s16 printWin(s16 x, s16 y, s16 w, s16 h, GXColor *color); +void pfDrawFonts(void); + +extern BOOL saftyFrameF; +extern u16 strlinecnt; +extern u16 empstrline; +extern int fontcolor; +extern u32 procfunc; + +#endif \ No newline at end of file diff --git a/include/game/process.h b/include/game/process.h new file mode 100644 index 00000000..fe3efcb0 --- /dev/null +++ b/include/game/process.h @@ -0,0 +1,62 @@ +#ifndef _GAME_PROCESS_H +#define _GAME_PROCESS_H + +#include "dolphin/types.h" + +#define PROCESS_STAT_PAUSE 0x1 +#define PROCESS_STAT_UPAUSE 0x2 +#define PROCESS_STAT_PAUSE_EN 0x4 +#define PROCESS_STAT_UPAUSE_EN 0x8 + +typedef struct jump_buf { + u32 lr; + u32 cr; + u32 sp; + u32 r2; + u32 pad; + u32 regs[19]; + double flt_regs[19]; +} jmp_buf; + +typedef struct process { + struct process *next; + struct process *prev; + struct process *child; + struct process *parent; + struct process *next_child; + struct process *first_child; + void *heap; + u16 exec; + u16 stat; + u16 prio; + int sleep_time; + u32 base_sp; + jmp_buf jump; + void (*dtor)(void); + void *user_data; +} Process; + +void HuPrcInit(void); +void HuPrcEnd(void); +Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size); +void HuPrcChildLink(Process *parent, Process *child); +void HuPrcChildUnlink(Process *process); +Process *HuPrcChildCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size, Process *parent); +void HuPrcChildWatch(void); +Process *HuPrcCurrentGet(void); +int HuPrcKill(Process *process); +void HuPrcChildKill(Process *process); +void HuPrcSleep(int time); +void HuPrcVSleep(void); +void HuPrcWakeup(Process *process); +void HuPrcDestructorSet2(Process *process, void (*func)(void)); +void HuPrcDestructorSet(void (*func)(void)); +void HuPrcCall(int tick); +void *HuPrcMemAlloc(s32 size); +void HuPrcMemFree(void *ptr); +void HuPrcSetStat(Process *process, u16 value); +void HuPrcResetStat(Process *process, u16 value); +void HuPrcAllPause(int flag); +void HuPrcAllUPause(int flag); + +#endif \ No newline at end of file diff --git a/include/game/sprite.h b/include/game/sprite.h new file mode 100644 index 00000000..1759e291 --- /dev/null +++ b/include/game/sprite.h @@ -0,0 +1,203 @@ +#ifndef _GAME_SPRITE_H +#define _GAME_SPRITE_H + +#include "dolphin.h" + +#define SPRITE_MAX 384 +#define SPRITE_GROUP_MAX 256 + +#define SPRITE_INVALID -1 +#define SPRITE_GROUP_INVALID -1 + +#define SPRITE_ATTR_PAUSED 0x1 +#define SPRITE_ATTR_LOOP 0x2 +#define SPRITE_ATTR_HIDDEN 0x4 +#define SPIRTE_ATTR_BILINEAR 0x8 +#define SPRITE_ATTR_FUNC 0x10 +#define SPRITE_ATTR_NOPAUSE 0x20 +#define SPRITE_ATTR_REVERSE 0x40 +#define SPRITE_ATTR_ADDITIVE 0x80 +#define SPRITE_ATTR_INVERT 0x100 + +#define SPRITE_BMP_RGBA8 0 +#define SPRITE_BMP_RGB5A3 1 +#define SPRITE_BMP_RGB5A3_DUPE 2 +#define SPRITE_BMP_C8 3 +#define SPRITE_BMP_C4 4 +#define SPRITE_BMP_IA8 5 +#define SPRITE_BMP_IA4 6 +#define SPRITE_BMP_I8 7 +#define SPRITE_BMP_I4 8 +#define SPRITE_BMP_A8 9 +#define SPRITE_BMP_CMPR 10 + +#define SPRITE_BMP_FMTMASK 0xF +#define SPRITE_BMP_ALLOC 0x8000 +#define SPRITE_BMP_NUM_MASK 0x7FFF + +#define SPRITE_LAYER_FLIPX 0x1 +#define SPRITE_LAYER_FLIPY 0x2 + +typedef void (*SpriteFunc)(struct sprite_data *); + +typedef struct anim_frame_data { + s16 pat; + s16 time; + s16 shiftX; + s16 shiftY; + s16 flip; + s16 pad; +} AnimFrameData; + +typedef struct anim_bank_data { + s16 timeNum; + s16 unk; + AnimFrameData *frame; +} AnimBankData; + +typedef struct anim_layer_data { + u8 alpha; + u8 flip; + s16 bmpNo; + s16 startX; + s16 startY; + s16 sizeX; + s16 sizeY; + s16 shiftX; + s16 shiftY; + s16 vtx[8]; +} AnimLayerData; + +typedef struct anim_pat_data { + s16 layerNum; + s16 centerX; + s16 centerY; + s16 sizeX; + s16 sizeY; + AnimLayerData *layer; +} AnimPatData; + +typedef struct anim_bmp_data { + u8 pixSize; + u8 dataFmt; + s16 palNum; + s16 sizeX; + s16 sizeY; + u32 dataSize; + void *palData; + void *data; +} AnimBmpData; + +typedef struct anim_data { + s16 bankNum; + s16 patNum; + s16 bmpNum; + s16 useNum; + AnimBankData *bank; + AnimPatData *pat; + AnimBmpData *bmp; +} AnimData; + +typedef struct sprite_data { + u8 r; + u8 g; + u8 b; + char draw_no; + short frame; + short bank; + short attr; + short dirty_flag; + short prio; + float time; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float speed; + float a; + GXTexWrapMode wrap_s; + GXTexWrapMode wrap_t; + short tex_scale_x; + short tex_scale_y; + Mtx *group_mtx; + union { + AnimData *data; + SpriteFunc func; + }; + AnimPatData *pat_data; + AnimFrameData *frame_data; + short work[4]; + AnimData *bg; + unsigned short bg_bank; + short scissor_x; + short scissor_y; + short scissor_w; + short scissor_h; +} SpriteData; + +typedef struct sprite_group_data { + short capacity; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float center_x; + float center_y; + short *members; + Mtx mtx; +} SpriteGroupData; + +extern SpriteData HuSprData[SPRITE_MAX]; +extern SpriteGroupData HuSprGrpData[SPRITE_GROUP_MAX]; + + +void HuSprInit(void); +void HuSprClose(void); +void HuSprExec(short draw_no); +void HuSprBegin(void); +SpriteData *HuSprCall(void); +void HuSprFinish(void); +void HuSprPauseSet(BOOL value); +AnimData *HuSprAnimRead(void *data); +void HuSprAnimLock(AnimData *anim); +short HuSprCreate(AnimData *anim, short prio, short bank); +short HuSprFuncCreate(SpriteFunc func, short prio); +short HuSprGrpCreate(short capacity); +short HuSprGrpCopy(short group); +void HuSprGrpMemberSet(short group, short member, short sprite); +void HuSprGrpMemberKill(short group, short member); +void HuSprGrpKill(short group); +void HuSprKill(short sprite); +void HuSprAnimKill(AnimData *anim); +void HuSprAttrSet(short group, short member, int attr); +void HuSprAttrReset(short group, short member, int attr); +void HuSprPosSet(short group, short member, float x, float y); +void HuSprZRotSet(short group, short member, float z_rot); +void HuSprScaleSet(short group, short member, float x, float y); +void HuSprTPLvlSet(short group, short member, float tp_lvl); +void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b); +void HuSprSpeedSet(short group, short member, float speed); +void HuSprBankSet(short group, short member, short bank); +void HuSprGrpPosSet(short group, float x, float y); +void HuSprGrpCenterSet(short group, float x, float y); +void HuSprGrpZRotSet(short group, float z_rot); +void HuSprGrpScaleSet(short group, float x, float y); +void HuSprGrpTPLvlSet(short group, float tp_lvl); +void HuSprGrpDrawNoSet(short group, int draw_no); +void HuSprDrawNoSet(short group, short member, int draw_no); +void HuSprPriSet(short group, short member, short prio); +void HuSprGrpScissorSet(short group, short x, short y, short w, short h); +void HuSprScissorSet(short group, short member, short x, short y, short w, short h); +AnimData *HuSprAnimMake(short sizeX, short sizeY, short dataFmt); +void HuSprBGSet(short group, short member, AnimData *bg, short bg_bank); +void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank); +void AnimDebug(AnimData *anim); + +void HuSprDispInit(void); +void HuSprDisp(SpriteData *sprite); +void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, GXTexWrapMode wrap_t, GXTexFilter filter); +void HuSprExecLayerSet(short draw_no, short layer); + +#endif \ No newline at end of file diff --git a/include/variables.h b/include/variables.h index b85f9afc..af46f34a 100644 --- a/include/variables.h +++ b/include/variables.h @@ -11,43 +11,18 @@ extern u16 HuPadBtnDown[4]; extern u8 HuPadDStk[4]; -extern OSHeapHandle currentHeapHandle; -extern GXRenderModeObj *RenderMode; - -extern BOOL saftyFrameF; -extern u16 strlinecnt; -extern u16 empstrline; -extern int fontcolor; -extern u32 procfunc; - extern WipeState wipeData; extern PlayerConfig GWPlayerCfg[4]; -extern FileListEntry _ovltbl[]; extern u32 DirDataSize; extern u32 totalPolyCnted; extern char fadeStat; -extern omObjData *omDBGSysKeyObj; -extern Process *omwatchproc; -extern OverlayID omnextovl; -extern OverlayID omcurovl; -extern int omcurdll; -extern int omovlhisidx; -extern int omovlevtno; -extern int omnextovlevtno; -extern int omovlstat; -extern char omUPauseFlag; -extern s16 omSysExitReq; -extern s16 omdispinfo; -extern char omSysPauseEnableFlag; -extern OverlayID omprevovl; extern PlayerState GWPlayer[4]; extern SystemState GWSystem; -extern u32 minimumVcount; #endif diff --git a/src/REL/bootDll/nintendo_data.c b/src/REL/bootDll/nintendo_data.c index 9dd15f2c..4e7ff5f1 100644 --- a/src/REL/bootDll/nintendo_data.c +++ b/src/REL/bootDll/nintendo_data.c @@ -1,4 +1,5 @@ #include "common.h" +#include "game/data.h" #include "logoNintendoData.inc" diff --git a/src/REL/subchrselDll/subchrselDll.c b/src/REL/subchrselDll/subchrselDll.c index 2f846f18..92b5264c 100644 --- a/src/REL/subchrselDll/subchrselDll.c +++ b/src/REL/subchrselDll/subchrselDll.c @@ -1,4 +1,7 @@ #include "common.h" +#include "game/object.h" +#include "game/printfunc.h" +#include "dolphin/pad.h" //HACK: Force 0.5 and 3.0 double constants to appear in REL const double _half = 0.5; @@ -38,7 +41,7 @@ static char *ext_character_str[7] = { void ModuleProlog(void) { - void* sp8 = omInitObjMan(0x32, 0x2000); + Process *sp8 = omInitObjMan(0x32, 0x2000); Hu3DBGColorSet(0, 0, 0); HuPrcChildCreate(SubchrMain, 4096, 12288, 0, HuPrcCurrentGet()); WipeCreate(1, 0, -1); @@ -69,17 +72,17 @@ static void SubchrMain() while(1) { int y, x; u16 btns; - fontcolor = 14; + fontcolor = FONT_COLOR_YELLOW; print8(150, 64, 2.0f, "Sub Character Select"); x = 170; y = 120; for(i=0; i<4; i++, y += 16) { - fontcolor = 12; + fontcolor = FONT_COLOR_GREEN; print8(x, y, 2.0f, player_numstr[i]); if(i == cursor_pos) { - fontcolor = 13; + fontcolor = FONT_COLOR_CYAN; } else { - fontcolor = 12; + fontcolor = FONT_COLOR_GREEN; } if(ext_character[i] != 0) { print8(x+200, y, 2.0f, ext_character_str[ext_character[i]]); @@ -87,7 +90,7 @@ static void SubchrMain() print8(x+200, y, 2.0f, character_str[character[i]]); } } - if(GetBtns() & 0x1000) { + if(GetBtns() & PAD_BUTTON_START) { for(i=0; i<4; i++) { if(ext_character[i] != 0) { GWPlayerCfg[i].character = ext_character[i]+7; @@ -102,7 +105,7 @@ static void SubchrMain() HuPrcVSleep(); } while(1); } else { - if(GetBtns() & 0x1) { + if(GetBtns() & PAD_BUTTON_LEFT) { do { ext_character[cursor_pos]--; if(ext_character[cursor_pos] < 0) { @@ -117,7 +120,7 @@ static void SubchrMain() } } while(i < 4); } - if(GetBtns() & 0x2) { + if(GetBtns() & PAD_BUTTON_RIGHT) { do { ext_character[cursor_pos]++; if(ext_character[cursor_pos] > 6) { @@ -132,10 +135,10 @@ static void SubchrMain() } } while(i < 4); } - if(GetBtns() & 0x4) { + if(GetBtns() & PAD_BUTTON_DOWN) { cursor_pos++; } - if(GetBtns() & 0x8) { + if(GetBtns() & PAD_BUTTON_UP) { cursor_pos--; } if(cursor_pos < 0) { @@ -144,7 +147,7 @@ static void SubchrMain() if(cursor_pos > 3) { cursor_pos = 0; } - if(GetBtns() & 0x200) { + if(GetBtns() & PAD_BUTTON_B) { HuAudFadeOut(30); WipeCreate(2, 0, -1); HuPrcSleep(wipeData.duration+1.0f); diff --git a/src/REL/w10Dll/w10Dll.c b/src/REL/w10Dll/w10Dll.c index 0c2e780a..2ffda651 100644 --- a/src/REL/w10Dll/w10Dll.c +++ b/src/REL/w10Dll/w10Dll.c @@ -1,4 +1,5 @@ #include "include/REL/w10Dll.h" +#include "game/data.h" //BSS s16 lbl_1_bss_22[11]; @@ -18,7 +19,7 @@ unkw10Dll lbl_1_data_0[1] = { 3300.0f, 100.0f, -900.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - 0x007B0003 + MAKE_DATA_NUM(DATADIR_W10, 3) }; @@ -38,23 +39,23 @@ s32 lbl_1_data_34[] = { }; s32 lbl_1_data_54[2] = { - 0x007B0012, - -1 + MAKE_DATA_NUM(DATADIR_W10, 18), + DATA_NUM_LISTEND }; s32 lbl_1_data_5C[2] = { - 0x00020009, - -1 + MAKE_DATA_NUM(DATADIR_BGUEST, 9), + DATA_NUM_LISTEND }; s32 lbl_1_data_64[2] = { - 0x00020018, - -1 + MAKE_DATA_NUM(DATADIR_BGUEST, 24), + DATA_NUM_LISTEND }; s32 lbl_1_data_6C[2] = { - 0x0002000E, - -1, + MAKE_DATA_NUM(DATADIR_BGUEST, 14), + DATA_NUM_LISTEND }; //RODATA @@ -86,26 +87,26 @@ void fn_1_E0(void) { fn_1_AEC(); fn_1_1D68(); lbl_1_bss_C = 0; - fn_800772EC(0x7B0000); + fn_800772EC(MAKE_DATA_NUM(DATADIR_W10, 0)); temp = fn_800745F0(0, 1); fn_800B4274(temp, 1); - lbl_1_data_28 = fn_8006D9A4(0x7B0001, NULL, 0); + lbl_1_data_28 = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_W10, 1), NULL, 0); fn_8006DDE8(lbl_1_data_28, -1.0f); fn_8006F1A8(lbl_1_data_28, 0.0f, 0.0f, 0.0f); fn_8006E2B8(lbl_1_data_28, 0, 0x40000001); fn_8006E878(lbl_1_data_28, 1.0f); - lbl_1_data_2A = fn_8006D9A4(0x7B0002, NULL, 0); + lbl_1_data_2A = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_W10, 2), NULL, 0); fn_8006DDE8(lbl_1_data_2A, -1.0f); fn_8006F1A8(lbl_1_data_2A, 0.0f, 0.0f, 0.0f); fn_8006E2B8(lbl_1_data_2A, 0, 0x40000001); - lbl_1_data_2C = fn_8006D9A4(0x7B0011, lbl_1_data_54, 0); + lbl_1_data_2C = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_W10, 17), lbl_1_data_54, 0); fn_8006F1A8(lbl_1_data_2C, 0.0f, 0.0f, 0.0f); fn_8006E2B8(lbl_1_data_2C, 1, 0x40000001); - lbl_1_data_2E = fn_8006D9A4(0x20005, lbl_1_data_5C, 0); + lbl_1_data_2E = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_BGUEST, 5), lbl_1_data_5C, 0); fn_8006E2B8(lbl_1_data_2E, 1, 0x40000001); - lbl_1_data_32 = fn_8006D9A4(0x20012, lbl_1_data_64, 0); + lbl_1_data_32 = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_BGUEST, 18), lbl_1_data_64, 0); fn_8006E2B8(lbl_1_data_32, 1, 0x40000001); - lbl_1_data_30 = fn_8006D9A4(0x2000D, lbl_1_data_6C, 0); + lbl_1_data_30 = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_BGUEST, 13), lbl_1_data_6C, 0); fn_8006E2B8(lbl_1_data_30, 1, 0x40000001); fn_8005D10C(&fn_1_8C0, &fn_1_904); for (i = 0; i < ARRAY_COUNT(lbl_1_data_0); i++) { diff --git a/src/REL/w10Dll/w10Dll2.c b/src/REL/w10Dll/w10Dll2.c index 431fbde2..c217853e 100644 --- a/src/REL/w10Dll/w10Dll2.c +++ b/src/REL/w10Dll/w10Dll2.c @@ -1,18 +1,19 @@ #include "REL/w10Dll.h" +#include "game/data.h" s32 lbl_1_data_78[2] = { - 0x007B0010, + MAKE_DATA_NUM(DATADIR_W10, 16), -1 }; -Vec3f lbl_1_data_80[2] = { +Vec lbl_1_data_80[2] = { {70.0f, 355.0f, 200.f}, {70.0f, 175.0f, 200.f}, }; void fn_1_AEC(void) { lbl_1_bss_1C = 0; - lbl_1_bss_1E = fn_8006D9A4(0x7B000F, &lbl_1_data_78, 0); + lbl_1_bss_1E = fn_8006D9A4(MAKE_DATA_NUM(DATADIR_W10, 15), &lbl_1_data_78, 0); fn_8006E2B8(lbl_1_bss_1E, 1, 0x40000001); fn_800B42BC(lbl_1_bss_1E); fn_8006F61C(lbl_1_bss_1E, 6); @@ -41,8 +42,8 @@ void fn_1_C10(s16 arg0) { void fn_1_C20(void) { Mtx sp20; - Vec3f sp14; - Vec3f sp8; + Vec sp14; + Vec sp8; while (1) { if (fn_8005B6A8() != 0) { diff --git a/src/REL/w10Dll/w10Dll3.c b/src/REL/w10Dll/w10Dll3.c index 6623b54e..6c44bc89 100644 --- a/src/REL/w10Dll/w10Dll3.c +++ b/src/REL/w10Dll/w10Dll3.c @@ -168,8 +168,8 @@ void fn_1_137C(void) { void fn_1_13A4(void) { s32 i; - Vec3f sp14; - Vec3f sp8; + Vec sp14; + Vec sp8; s32 temp_r3_2; fn_1_BA0(0x2E0023); diff --git a/src/REL/w10Dll/w10Dll4.c b/src/REL/w10Dll/w10Dll4.c index b435f8bc..c89293c8 100644 --- a/src/REL/w10Dll/w10Dll4.c +++ b/src/REL/w10Dll/w10Dll4.c @@ -1,4 +1,5 @@ #include "REL/w10Dll.h" +#include "game/data.h" char lbl_1_data_98[] = "@@@@@@@@@@@@@@ Tutorial Exit @@@@@@@@@@@@@@\n\000"; @@ -64,17 +65,17 @@ w10DllUnk04 lbl_1_data_108[42] = { char lbl_1_data_258[] = "Tutorial Hook P0:%d P1:%d P2:%d P3:%d SCEN:%d CUE:%d PRM:%d DICE:%d MSG:%d\n"; s32 lbl_1_data_2A8[11] = { -0x007B0004, -0x007B0005, -0x007B0006, -0x007B0007, -0x007B0008, -0x007B0009, -0x007B000A, -0x007B000B, -0x007B000C, -0x007B000D, -0x007B000E + MAKE_DATA_NUM(DATADIR_W10, 4), + MAKE_DATA_NUM(DATADIR_W10, 5), + MAKE_DATA_NUM(DATADIR_W10, 6), + MAKE_DATA_NUM(DATADIR_W10, 7), + MAKE_DATA_NUM(DATADIR_W10, 8), + MAKE_DATA_NUM(DATADIR_W10, 9), + MAKE_DATA_NUM(DATADIR_W10, 10), + MAKE_DATA_NUM(DATADIR_W10, 11), + MAKE_DATA_NUM(DATADIR_W10, 12), + MAKE_DATA_NUM(DATADIR_W10, 13), + MAKE_DATA_NUM(DATADIR_W10, 14) }; void fn_1_176C(void) { diff --git a/src/game/data.c b/src/game/data.c index 877a8be7..b69447fc 100644 --- a/src/game/data.c +++ b/src/game/data.c @@ -1,4 +1,5 @@ #include "common.h" +#include "game/data.h" #include "dolphin/dvd.h" #define PTR_OFFSET(ptr, offset) (void *)(((u8 *)(ptr)+(u32)(offset))) diff --git a/src/game/decode.c b/src/game/decode.c index ce4c2d9d..b55eb9ef 100644 --- a/src/game/decode.c +++ b/src/game/decode.c @@ -1,4 +1,5 @@ #include "common.h" +#include "game/data.h" #include "dolphin/os.h" struct decode_data @@ -181,27 +182,27 @@ void HuDecodeData(void *src, void *dst, u32 size, int decode_type) decode_ptr->dst = dst; decode_ptr->size = size; switch(decode_type) { - case 0: + case DATA_DECODE_NONE: HuDecodeNone(decode_ptr); break; - case 1: + case DATA_DECODE_LZ: HuDecodeLz(decode_ptr); break; - case 2: + case DATA_DECODE_SLIDE: HuDecodeSlide(decode_ptr); break; - case 3: + case DATA_DECODE_FSLIDE_ALT: HuDecodeFslide(decode_ptr); break; - case 4: + case DATA_DECODE_FSLIDE: HuDecodeFslide(decode_ptr); break; - case 5: + case DATA_DECODE_RLE: HuDecodeRle(decode_ptr); break; diff --git a/src/game/dvd.c b/src/game/dvd.c index f79d828f..31d58430 100644 --- a/src/game/dvd.c +++ b/src/game/dvd.c @@ -1,4 +1,7 @@ #include "common.h" +#include "game/dvd.h" +#include "game/data.h" + #include "dolphin/dvd.h" #include "dolphin/os.h" diff --git a/src/game/init.c b/src/game/init.c index 2c54b1ef..443afebd 100644 --- a/src/game/init.c +++ b/src/game/init.c @@ -1,4 +1,5 @@ #include "common.h" +#include "game/init.h" #include "dolphin/os.h" #include "dolphin/gx.h" #include "dolphin/dvd.h" diff --git a/src/game/malloc.c b/src/game/malloc.c index 6f350244..4ae860e2 100644 --- a/src/game/malloc.c +++ b/src/game/malloc.c @@ -1,4 +1,6 @@ #include "common.h" +#include "game/memory.h" +#include "game/init.h" #include "dolphin/os.h" static u32 HeapSizeTbl[HEAP_MAX] = { 0x240000, 0x140000, 0xA80000, 0x580000, 0 }; diff --git a/src/game/memory.c b/src/game/memory.c index 213f51c8..56201187 100644 --- a/src/game/memory.c +++ b/src/game/memory.c @@ -1,4 +1,5 @@ #include "common.h" +#include "game/memory.h" #include "dolphin/os.h" #define DATA_GET_BLOCK(ptr) ((struct memory_block *)(((char *)(ptr))-32)) diff --git a/src/game/objmain.c b/src/game/objmain.c index 5e75511d..ab6f414d 100644 --- a/src/game/objmain.c +++ b/src/game/objmain.c @@ -1,4 +1,6 @@ #include "common.h" +#include "game/printfunc.h" +#include "game/object.h" #define OM_OVL_HIS_MAX 16 #define OM_MAX_GROUPS 10 @@ -141,10 +143,10 @@ void omOvlKill(s16 arg) HuWinAllKill(); HuSprClose(); HuPrcChildKill(omwatchproc); - HuMemDirectFreeNum(HEAP_SYSTEM, 0x10000000); - HuDataDirCloseNum(0x10000000); - HuMemDirectFreeNum(HEAP_DVD, 0x10000000); - HuMemDirectFreeNum(HEAP_DATA, 0x10000000); + HuMemDirectFreeNum(HEAP_SYSTEM, MEMORY_DEFAULT_NUM); + HuDataDirCloseNum(MEMORY_DEFAULT_NUM); + HuMemDirectFreeNum(HEAP_DVD, MEMORY_DEFAULT_NUM); + HuMemDirectFreeNum(HEAP_DATA, MEMORY_DEFAULT_NUM); HuPadRumbleAllStop(); HuAudFXListnerKill(); OSReport("OvlKill %d\n", arg); @@ -188,8 +190,8 @@ Process *omInitObjMan(s16 max_objs, int prio) max_objs += 2; omSysExitReq = FALSE; process = HuPrcChildCreate(omMain, prio, 16384, 0, omwatchproc); - HuPrcSetStat(process, 12); - objman = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(omObjMan), 0x10000000); + HuPrcSetStat(process, PROCESS_STAT_PAUSE_EN|PROCESS_STAT_UPAUSE_EN); + objman = HuMemDirectMallocNum(HEAP_SYSTEM, sizeof(omObjMan), MEMORY_DEFAULT_NUM); objman->max_objs = max_objs; process->user_data = objman; process->dtor = omDestroyObjMan; @@ -197,9 +199,9 @@ Process *omInitObjMan(s16 max_objs, int prio) objman->next_idx = 0; objman->obj_last = -1; objman->obj_first = -1; - obj_all = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData), 0x10000000); + obj_all = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData), MEMORY_DEFAULT_NUM); objman->obj = obj_all; - group_all = HuMemDirectMallocNum(HEAP_SYSTEM, OM_MAX_GROUPS*sizeof(omObjGroup), 0x10000000); + group_all = HuMemDirectMallocNum(HEAP_SYSTEM, OM_MAX_GROUPS*sizeof(omObjGroup), MEMORY_DEFAULT_NUM); objman->group = group_all; for(i=0; iprio = prio; omInsertObj(objman_process, object); if(mdlcnt) { - object->model = HuMemDirectMallocNum(HEAP_SYSTEM, mdlcnt*sizeof(s16), 0x10000000); + object->model = HuMemDirectMallocNum(HEAP_SYSTEM, mdlcnt*sizeof(s16), MEMORY_DEFAULT_NUM); object->mdlcnt = mdlcnt; for(i=0; imodel[i] = -1; @@ -261,7 +263,7 @@ omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, object->mdlcnt = 0; } if(mtncnt) { - object->motion = HuMemDirectMallocNum(HEAP_SYSTEM, mtncnt*sizeof(s16), 0x10000000); + object->motion = HuMemDirectMallocNum(HEAP_SYSTEM, mtncnt*sizeof(s16), MEMORY_DEFAULT_NUM); object->mtncnt = mtncnt; } else { object->motion = NULL; @@ -273,7 +275,7 @@ omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, object->group = group; object->group_idx = 0; } - object->stat = 4; + object->stat = OM_STAT_ACTIVE; object->unk10 = 0; object->func = func; object->work[0] = object->work[1] = object->work[2] = object->work[3] = 0; @@ -363,7 +365,7 @@ void omDelObjEx(Process *objman_process, omObjData *object) HuMemDirectFree(object->data); object->data = NULL; } - object->stat = 1; + object->stat = OM_STAT_DELETED; if(object->next >= 0) { obj_all[object->next].prev = object->prev; } @@ -412,8 +414,8 @@ void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs) group_ptr->next_idx = 0; group_ptr->max_objs = max_objs; group_ptr->num_objs = 0; - group_ptr->obj = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData *), 0x10000000); - group_ptr->next = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(u16), 0x10000000); + group_ptr->obj = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(omObjData *), MEMORY_DEFAULT_NUM); + group_ptr->next = HuMemDirectMallocNum(HEAP_SYSTEM, max_objs*sizeof(u16), MEMORY_DEFAULT_NUM); for(i=0; iobj[i] = NULL; group_ptr->next[i] = i+1; @@ -474,7 +476,7 @@ void omMain(void) color.g = 0; color.b = 255; printWin(7, 23, 128*scale, 40*scale, &color); - fontcolor = 14; + fontcolor = FONT_COLOR_YELLOW; print8(8, 24, scale, "\xFD\x01H:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_SYSTEM), HuMemUsedMallocBlockGet(HEAP_SYSTEM)); print8(8, 24+(8*scale), scale, "\xFD\x01M:%08lX(%ld)", HuMemUsedMallocSizeGet(HEAP_DATA), HuMemUsedMallocBlockGet(HEAP_DATA)); print8(8, 24+(16*scale), scale, "\xFD\x01OBJ:%d/%d", objman->num_objs, objman->max_objs); @@ -485,18 +487,18 @@ void omMain(void) while(obj_index != -1) { object = &obj_all[obj_index]; obj_index = object->prev; - if((object->stat & 0x3) == 0) { - if(object->func != NULL && (object->stat & 0x58) == 0) { + if((object->stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) == 0) { + if(object->func != NULL && (object->stat & (0x40|0x8|OM_STAT_PAUSED)) == 0) { object->func(object); } if(omcurovl == -1 || objman->obj_last == -1) { break; } - if((object->stat & 0x3) == 0) { - if((obj_all[obj_index].stat & 0x3) != 0) { + if((object->stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) == 0) { + if((obj_all[obj_index].stat & (OM_STAT_DELETED|OM_STAT_DISABLED)) != 0) { obj_index = object->prev; } - if(object->model != NULL && object->model[0] != -1 && !(object->stat & 0x100)) { + if(object->model != NULL && object->model[0] != -1 && !(object->stat & OM_STAT_MODEL_PAUSED)) { Hu3DModelPosSet(object->model[0], object->trans.x, object->trans.y, object->trans.z); Hu3DModelRotSet(object->model[0], object->rot.x, object->rot.y, object->rot.z); Hu3DModelScaleSet(object->model[0], object->scale.x, object->scale.y, object->scale.z); @@ -535,14 +537,14 @@ void omAllPause(BOOL pause) int i; if(pause) { for(i=0; imax_objs; i++) { - if((objman->obj[i].stat & 0x21) == 0) { - omSetStatBit(&objman->obj[i], 0x10); + if((objman->obj[i].stat & (OM_STAT_DELETED|OM_STAT_NOPAUSE)) == 0) { + omSetStatBit(&objman->obj[i], OM_STAT_PAUSED); } } } else { for(i=0; imax_objs; i++) { - if((objman->obj[i].stat & 0x21) == 0) { - omResetStatBit(&objman->obj[i], 0x10); + if((objman->obj[i].stat & (OM_STAT_DELETED|OM_STAT_NOPAUSE)) == 0) { + omResetStatBit(&objman->obj[i], OM_STAT_PAUSED); } } } diff --git a/src/game/ovllist.c b/src/game/ovllist.c index a4538483..d20c6245 100644 --- a/src/game/ovllist.c +++ b/src/game/ovllist.c @@ -1,5 +1,6 @@ #include "common.h" - +#include "game/dvd.h" +#include "game/object.h" #define OVL_DEFINE(name, path) { path, 0 }, diff --git a/src/game/printfunc.c b/src/game/printfunc.c index a976be7e..bf8a9c4e 100644 --- a/src/game/printfunc.c +++ b/src/game/printfunc.c @@ -1,7 +1,7 @@ #include "common.h" -#include "dolphin/mtx.h" -#include "dolphin/gx.h" -#include "dolphin/vi.h" +#include "dolphin.h" +#include "game/printfunc.h" +#include "game/init.h" #include "stdio.h" #include "stdarg.h" diff --git a/src/game/process.c b/src/game/process.c index 7e84081d..20d286f5 100644 --- a/src/game/process.c +++ b/src/game/process.c @@ -1,6 +1,10 @@ #include "common.h" +#include "game/process.h" +#include "game/memory.h" #include "dolphin/os.h" +#define PROCESS_MEMORY_RETADDR 0xA5A5A5A5 + extern int gcsetjmp(jmp_buf *jump); extern void gclongjmp(jmp_buf *jump, int status); @@ -75,13 +79,13 @@ Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_siz return NULL; } HuMemHeapInit(heap, alloc_size); - process = HuMemMemoryAlloc(heap, sizeof(Process), 0xA5A5A5A5); + process = HuMemMemoryAlloc(heap, sizeof(Process), PROCESS_MEMORY_RETADDR); process->heap = heap; process->exec = EXEC_NORMAL; process->stat = 0; process->prio = prio; process->sleep_time = 0; - process->base_sp = ((u32)HuMemMemoryAlloc(heap, stack_size, 0xA5A5A5A5))+stack_size-8; + process->base_sp = ((u32)HuMemMemoryAlloc(heap, stack_size, PROCESS_MEMORY_RETADDR))+stack_size-8; gcsetjmp(&process->jump); process->jump.lr = (u32)func; process->jump.sp = process->base_sp; @@ -196,7 +200,7 @@ void HuPrcEnd() gcTerminateProcess(process); } -void HuPrcSleep(s32 time) +void HuPrcSleep(int time) { Process *process = HuPrcCurrentGet(); if(time != 0 && process->exec != EXEC_KILLED) { @@ -256,7 +260,7 @@ void HuPrcCall(int tick) return; } procfunc = process->jump.lr; - if((process->stat & 0x3) && process->exec != EXEC_KILLED) { + if((process->stat & (PROCESS_STAT_PAUSE|PROCESS_STAT_UPAUSE)) && process->exec != EXEC_KILLED) { ret = 1; continue; } @@ -293,12 +297,12 @@ void HuPrcCall(int tick) void *HuPrcMemAlloc(s32 size) { Process *process = HuPrcCurrentGet(); - return HuMemMemoryAlloc(process->heap, size, 0xA5A5A5A5); + return HuMemMemoryAlloc(process->heap, size, PROCESS_MEMORY_RETADDR); } void HuPrcMemFree(void *ptr) { - HuMemMemoryFree(ptr, 0xA5A5A5A5); + HuMemMemoryFree(ptr, PROCESS_MEMORY_RETADDR); } void HuPrcSetStat(Process *process, u16 value) @@ -316,16 +320,16 @@ void HuPrcAllPause(int flag) Process *process = processtop; if(flag) { while(process != NULL) { - if(!(process->stat & 0x4)) { - HuPrcSetStat(process, 0x1); + if(!(process->stat & PROCESS_STAT_PAUSE_EN)) { + HuPrcSetStat(process, PROCESS_STAT_PAUSE); } process = process->next; } } else { while(process != NULL) { - if(process->stat & 0x1) { - HuPrcResetStat(process, 0x1); + if(process->stat & PROCESS_STAT_PAUSE) { + HuPrcResetStat(process, PROCESS_STAT_PAUSE); } process = process->next; @@ -338,16 +342,16 @@ void HuPrcAllUPause(int flag) Process *process = processtop; if(flag) { while(process != NULL) { - if(!(process->stat & 0x8)) { - HuPrcSetStat(process, 0x2); + if(!(process->stat & PROCESS_STAT_UPAUSE_EN)) { + HuPrcSetStat(process, PROCESS_STAT_UPAUSE); } process = process->next; } } else { while(process != NULL) { - if(process->stat & 0x2) { - HuPrcResetStat(process, 0x2); + if(process->stat & PROCESS_STAT_UPAUSE) { + HuPrcResetStat(process, PROCESS_STAT_UPAUSE); } process = process->next; diff --git a/src/game/sprman.c b/src/game/sprman.c index 4882c73c..dbe1da85 100644 --- a/src/game/sprman.c +++ b/src/game/sprman.c @@ -1,15 +1,29 @@ #include "common.h" +#include "game/sprite.h" +#include "game/memory.h" +#include "game/init.h" + #include "dolphin/mtx.h" -SpriteData HuSprData[384]; -SpriteGroupData HuSprGrpData[256]; -static SpriteOrderData HuSprOrder[384*2]; +#define SPRITE_DIRTY_ATTR 0x1 +#define SPRITE_DIRTY_XFORM 0x2 +#define SPRITE_DIRTY_COLOR 0x4 + +typedef struct sprite_order_data { + unsigned short group; + unsigned short sprite; + unsigned short prio; + unsigned short next; +} SpriteOrderData; + +SpriteData HuSprData[SPRITE_MAX]; +SpriteGroupData HuSprGrpData[SPRITE_GROUP_MAX]; +static SpriteOrderData HuSprOrder[SPRITE_MAX*2]; static short HuSprOrderNum; static short HuSprOrderNo; static BOOL HuSprPauseF; - static void HuSprOrderEntry(short group, short sprite); void mtxTransCat(Mtx matrix, float x, float y, int z); //Last argument should be a float @@ -19,10 +33,10 @@ void HuSprInit(void) short i; SpriteData *sprite; SpriteGroupData *group; - for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) { + for(sprite = &HuSprData[1], i=1; idata = NULL; } - for(group = HuSprGrpData, i=0; i<256; i++, group++) { + for(group = HuSprGrpData, i=0; icapacity = 0; } sprite = &HuSprData[0]; @@ -37,12 +51,12 @@ void HuSprClose(void) SpriteGroupData *group; SpriteData *sprite; - for(group = HuSprGrpData, i=0; i<256; i++, group++) { + for(group = HuSprGrpData, i=0; icapacity != 0) { HuSprGrpKill(i); } } - for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) { + for(sprite = &HuSprData[1], i=1; idata) { HuSprKill(i); } @@ -54,7 +68,7 @@ void HuSprExec(short draw_no) { SpriteData *sprite; while(sprite = HuSprCall()) { - if(!(sprite->attr & 0x4) && sprite->draw_no == draw_no) { + if(!(sprite->attr & SPRITE_ATTR_HIDDEN) && sprite->draw_no == draw_no) { HuSprDisp(sprite); } } @@ -70,7 +84,7 @@ void HuSprBegin(void) HuSprOrderNum = 1; HuSprOrder[0].next = 0; HuSprOrder[0].prio = -1; - for(i=0; i<256; i++, group++) { + for(i=0; icapacity != 0) { MTXTrans(temp, group->center_x*group->scale_x, group->center_y*group->scale_y, 0.0f); MTXRotAxisDeg(rot, &axis, group->z_rot); @@ -93,7 +107,7 @@ static void HuSprOrderEntry(short group, short sprite) SpriteOrderData *order = &HuSprOrder[HuSprOrderNum]; short prio = HuSprData[sprite].prio; short prev, next; - if(HuSprOrderNum >= 384*2) { + if(HuSprOrderNum >= SPRITE_MAX*2) { OSReport("Order Max Over!\n"); return; } @@ -118,7 +132,7 @@ SpriteData *HuSprCall(void) SpriteOrderData *order = &HuSprOrder[HuSprOrderNo]; SpriteData *sprite = &HuSprData[order->sprite]; sprite->group_mtx = &HuSprGrpData[order->group].mtx; - if(sprite->attr & 0x10) { + if(sprite->attr & SPRITE_ATTR_FUNC) { return sprite; } sprite->frame_data = &sprite->data->bank[sprite->bank].frame[sprite->frame]; @@ -129,13 +143,13 @@ SpriteData *HuSprCall(void) } } -static inline void SpriteCalcFrame(SpriteData *sprite, AnimBankData *bank, AnimFrameData **frame, short wrap) +static inline void SpriteCalcFrame(SpriteData *sprite, AnimBankData *bank, AnimFrameData **frame, short loop) { if(sprite->time >= (*frame)->time) { sprite->frame++; sprite->time -= (*frame)->time; if(sprite->frame >= bank->timeNum || (*frame)[1].time == -1) { - if(wrap) { + if(loop) { sprite->frame = 0; } else { sprite->frame = bank->timeNum-1; @@ -145,7 +159,7 @@ static inline void SpriteCalcFrame(SpriteData *sprite, AnimBankData *bank, AnimF } else if(sprite->time < 0) { sprite->frame--; if(sprite->frame < 0) { - if(wrap) { + if(loop) { sprite->frame = bank->timeNum-1; } else { sprite->frame = 0; @@ -164,25 +178,24 @@ void HuSprFinish(void) SpriteData *sprite; short i; short j; - short wrap; + short loop; short dir; - - for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) { - if(sprite->data && !(sprite->attr & 0x10)) { - if(!HuSprPauseF || (sprite->attr & 0x20)) { + for(sprite = &HuSprData[1], i=1; idata && !(sprite->attr & SPRITE_ATTR_FUNC)) { + if(!HuSprPauseF || (sprite->attr & SPRITE_ATTR_NOPAUSE)) { anim = sprite->data; bank = &anim->bank[sprite->bank]; frame = &bank->frame[sprite->frame]; - wrap = (sprite->attr & 0x2) ? 0 : 1; - if(!(sprite->attr & 0x1)) { - dir = (sprite->attr & 0x40) ? -1 : 1; + loop = (sprite->attr & SPRITE_ATTR_LOOP) ? 0 : 1; + if(!(sprite->attr & SPRITE_ATTR_PAUSED)) { + dir = (sprite->attr & SPRITE_ATTR_REVERSE) ? -1 : 1; for(j=0; j<(int)sprite->speed*minimumVcount; j++) { sprite->time += dir; - SpriteCalcFrame(sprite, bank, &frame, wrap); + SpriteCalcFrame(sprite, bank, &frame, loop); } sprite->time += (sprite->speed*(float)minimumVcount)-j; - SpriteCalcFrame(sprite, bank, &frame, wrap); + SpriteCalcFrame(sprite, bank, &frame, loop); } sprite->dirty_flag = 0; } @@ -236,13 +249,13 @@ short HuSprCreate(AnimData *anim, short prio, short bank) { SpriteData *sprite; short i; - for(sprite = &HuSprData[1], i=1; i<384; i++, sprite++) { + for(sprite = &HuSprData[1], i=1; idata) { break; } } - if(i == 384) { - return -1; + if(i == SPRITE_MAX) { + return SPRITE_INVALID; } sprite->data = anim; sprite->speed = 1.0f; @@ -271,12 +284,12 @@ short HuSprFuncCreate(void (*func)(SpriteData *sprite), short prio) { SpriteData *sprite; short index = HuSprCreate(NULL, prio, 0); - if(index == -1) { - return -1; + if(index == SPRITE_INVALID) { + return SPRITE_INVALID; } sprite = &HuSprData[index]; sprite->func = func; - sprite->attr |= 0x10; + sprite->attr |= SPRITE_ATTR_FUNC; return index; } @@ -284,17 +297,17 @@ short HuSprGrpCreate(short capacity) { SpriteGroupData *group; short i, j; - for(group = HuSprGrpData, i=0; i<256; i++, group++) { + for(group = HuSprGrpData, i=0; icapacity == 0) { break; } } - if(i == 256) { - return -1; + if(i == SPRITE_GROUP_MAX) { + return SPRITE_GROUP_INVALID; } group->members = HuMemDirectMalloc(HEAP_SYSTEM, sizeof(short)*capacity); for(j=0; jmembers[j] = -1; + group->members[j] = SPRITE_INVALID; } group->capacity = capacity; group->x = group->y = group->z_rot = group->center_x = group->center_y = 0.0f; @@ -308,8 +321,8 @@ short HuSprGrpCopy(short group) SpriteGroupData *group_ptr = &HuSprGrpData[group]; short new_group = HuSprGrpCreate(group_ptr->capacity); short i; - if(new_group == -1) { - return -1; + if(new_group == SPRITE_GROUP_INVALID) { + return SPRITE_GROUP_INVALID; } new_group_ptr = &HuSprGrpData[new_group]; new_group_ptr->x = group_ptr->x; @@ -320,7 +333,7 @@ short HuSprGrpCopy(short group) new_group_ptr->center_x = group_ptr->center_x; new_group_ptr->center_y = group_ptr->center_y; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { + if(group_ptr->members[i] != SPRITE_INVALID) { SpriteData *old_sprite = &HuSprData[group_ptr->members[i]]; short new_sprite = HuSprCreate(old_sprite->data, old_sprite->prio, old_sprite->bank); HuSprData[new_sprite] = *old_sprite; @@ -334,7 +347,7 @@ void HuSprGrpMemberSet(short group, short member, short sprite) { SpriteGroupData *group_ptr = &HuSprGrpData[group]; SpriteData *sprite_ptr = &HuSprData[sprite]; - if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] != -1) { + if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] != SPRITE_INVALID) { return; } group_ptr->members[member] = sprite; @@ -343,11 +356,11 @@ void HuSprGrpMemberSet(short group, short member, short sprite) void HuSprGrpMemberKill(short group, short member) { SpriteGroupData *group_ptr = &HuSprGrpData[group]; - if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) { + if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == SPRITE_INVALID) { return; } HuSprKill(group_ptr->members[member]); - group_ptr->members[member] = -1; + group_ptr->members[member] = SPRITE_INVALID; } void HuSprGrpKill(short group) @@ -355,11 +368,11 @@ void HuSprGrpKill(short group) SpriteGroupData *group_ptr = &HuSprGrpData[group]; short i; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { + if(group_ptr->members[i] != SPRITE_INVALID) { HuSprKill(group_ptr->members[i]); } } - group_ptr->capacity = 0; + group_ptr->capacity = 0; HuMemDirectFree(group_ptr->members); } @@ -369,7 +382,7 @@ void HuSprKill(short sprite) if(!sprite_ptr->data) { return; } - if(!(sprite_ptr->attr & 0x10)) { + if(!(sprite_ptr->attr & SPRITE_ATTR_FUNC)) { HuSprAnimKill(sprite_ptr->data); if(sprite_ptr->bg) { HuSprAnimKill(sprite_ptr->bg); @@ -382,7 +395,7 @@ void HuSprKill(short sprite) void HuSprAnimKill(AnimData *anim) { if(--anim->useNum <= 0) { - if(anim->bmpNum & 0x8000) { + if(anim->bmpNum & SPRITE_BMP_ALLOC) { if(anim->bmp->data) { HuMemDirectFree(anim->bmp->data); } @@ -398,24 +411,24 @@ void HuSprAttrSet(short group, short member, int attr) { SpriteGroupData *group_ptr = &HuSprGrpData[group]; SpriteData *sprite_ptr; - if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) { + if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == SPRITE_INVALID) { return; } sprite_ptr = &HuSprData[group_ptr->members[member]]; sprite_ptr->attr |= attr; - sprite_ptr->dirty_flag |= 0x1; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_ATTR; } void HuSprAttrReset(short group, short member, int attr) { SpriteGroupData *group_ptr = &HuSprGrpData[group]; SpriteData *sprite_ptr; - if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == -1) { + if(group_ptr->capacity == 0 || group_ptr->capacity <= member || group_ptr->members[member] == SPRITE_INVALID) { return; } sprite_ptr = &HuSprData[group_ptr->members[member]]; sprite_ptr->attr &= ~attr; - sprite_ptr->dirty_flag |= 0x1; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_ATTR; } void HuSprPosSet(short group, short member, float x, float y) @@ -423,14 +436,14 @@ void HuSprPosSet(short group, short member, float x, float y) SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]]; sprite_ptr->x = x; sprite_ptr->y = y; - sprite_ptr->dirty_flag |= 0x2; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_XFORM; } void HuSprZRotSet(short group, short member, float z_rot) { SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]]; sprite_ptr->z_rot = z_rot; - sprite_ptr->dirty_flag |= 0x2; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_XFORM; } void HuSprScaleSet(short group, short member, float x, float y) @@ -438,14 +451,14 @@ void HuSprScaleSet(short group, short member, float x, float y) SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]]; sprite_ptr->scale_x = x; sprite_ptr->scale_y = y; - sprite_ptr->dirty_flag |= 0x2; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_XFORM; } void HuSprTPLvlSet(short group, short member, float tp_lvl) { SpriteData *sprite_ptr = &HuSprData[HuSprGrpData[group].members[member]]; sprite_ptr->a = tp_lvl*255; - sprite_ptr->dirty_flag |= 0x4; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_COLOR; } void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b) @@ -454,7 +467,7 @@ void HuSprColorSet(short group, short member, u8 r, u8 g, u8 b) sprite_ptr->r = r; sprite_ptr->g = g; sprite_ptr->b = b; - sprite_ptr->dirty_flag |= 0x4; + sprite_ptr->dirty_flag |= SPRITE_DIRTY_COLOR; } void HuSprSpeedSet(short group, short member, float speed) @@ -470,7 +483,7 @@ void HuSprBankSet(short group, short member, short bank) AnimBankData *bank_ptr = &anim->bank[sprite_ptr->bank]; AnimFrameData *frame_ptr = &bank_ptr->frame[sprite_ptr->frame]; sprite_ptr->bank = bank; - if(sprite_ptr->attr & 0x40) { + if(sprite_ptr->attr & SPRITE_ATTR_REVERSE) { sprite_ptr->frame = bank_ptr->timeNum-1; frame_ptr = &bank_ptr->frame[sprite_ptr->frame]; sprite_ptr->time = frame_ptr->time; @@ -488,7 +501,7 @@ void HuSprGrpPosSet(short group, float x, float y) group_ptr->y = y; for(i=0; icapacity; i++) { if(group_ptr->members[i] != -1) { - HuSprData[group_ptr->members[i]].dirty_flag |= 0x2; + HuSprData[group_ptr->members[i]].dirty_flag |= SPRITE_DIRTY_XFORM; } } } @@ -500,8 +513,8 @@ void HuSprGrpCenterSet(short group, float x, float y) group_ptr->center_x = x; group_ptr->center_y = y; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { - HuSprData[group_ptr->members[i]].dirty_flag |= 0x2; + if(group_ptr->members[i] != SPRITE_INVALID) { + HuSprData[group_ptr->members[i]].dirty_flag |= SPRITE_DIRTY_XFORM; } } } @@ -512,8 +525,8 @@ void HuSprGrpZRotSet(short group, float z_rot) short i; group_ptr->z_rot = z_rot; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { - HuSprData[group_ptr->members[i]].dirty_flag |= 0x2; + if(group_ptr->members[i] != SPRITE_INVALID) { + HuSprData[group_ptr->members[i]].dirty_flag |= SPRITE_DIRTY_XFORM; } } } @@ -525,8 +538,8 @@ void HuSprGrpScaleSet(short group, float x, float y) group_ptr->scale_x = x; group_ptr->scale_y = y; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { - HuSprData[group_ptr->members[i]].dirty_flag |= 0x2; + if(group_ptr->members[i] != SPRITE_INVALID) { + HuSprData[group_ptr->members[i]].dirty_flag |= SPRITE_DIRTY_XFORM; } } } @@ -536,9 +549,9 @@ void HuSprGrpTPLvlSet(short group, float tp_lvl) SpriteGroupData *group_ptr = &HuSprGrpData[group]; short i; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { + if(group_ptr->members[i] != SPRITE_INVALID) { HuSprData[group_ptr->members[i]].a = tp_lvl*255; - HuSprData[group_ptr->members[i]].dirty_flag |= 0x4; + HuSprData[group_ptr->members[i]].dirty_flag |= SPRITE_DIRTY_COLOR; } } } @@ -548,7 +561,7 @@ void HuSprGrpDrawNoSet(short group, int draw_no) SpriteGroupData *group_ptr = &HuSprGrpData[group]; short i; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { + if(group_ptr->members[i] != SPRITE_INVALID) { HuSprData[group_ptr->members[i]].draw_no = draw_no; } } @@ -571,7 +584,7 @@ void HuSprGrpScissorSet(short group, short x, short y, short w, short h) SpriteGroupData *group_ptr = &HuSprGrpData[group]; short i; for(i=0; icapacity; i++) { - if(group_ptr->members[i] != -1) { + if(group_ptr->members[i] != SPRITE_INVALID) { HuSprScissorSet(group, i, x, y, w, h); } } @@ -615,7 +628,7 @@ AnimData *HuSprAnimMake(short sizeX, short sizeY, short dataFmt) anim->useNum = 0; anim->bankNum = 1; anim->patNum = 1; - anim->bmpNum = (1|0x8000); + anim->bmpNum = (1|SPRITE_BMP_ALLOC); bank->timeNum = 1; bank->unk = 10; frame->pat = 0; @@ -663,7 +676,7 @@ void HuSprSprBGSet(short sprite, AnimData *bg, short bg_bank) sprite_ptr->bg = bg; sprite_ptr->bg_bank = bg_bank; sprite_ptr->wrap_t = sprite_ptr->wrap_s = GX_REPEAT; - sprite_ptr->attr &= ~0x8; + sprite_ptr->attr &= ~SPIRTE_ATTR_BILINEAR; } void AnimDebug(AnimData *anim) @@ -676,7 +689,7 @@ void AnimDebug(AnimData *anim) AnimBankData *bank; AnimBmpData *bmp; - OSReport("patNum %d,bankNum %d,bmpNum %d\n", anim->patNum, anim->bankNum, anim->bmpNum & 0x7FFF); + OSReport("patNum %d,bankNum %d,bmpNum %d\n", anim->patNum, anim->bankNum, anim->bmpNum & SPRITE_BMP_NUM_MASK); pat = anim->pat; for(i=0; ipatNum; i++) { OSReport("PATTERN%d:\n", i); @@ -704,7 +717,7 @@ void AnimDebug(AnimData *anim) bank++; } bmp = anim->bmp; - for(i=0; ibmpNum & 0x7FFF; i++) { + for(i=0; ibmpNum & SPRITE_BMP_NUM_MASK; i++) { OSReport("BMP%d:\n", i); OSReport("\tpixSize %d,palNum %d,size (%d,%d)\n", bmp->pixSize, bmp->palNum, bmp->sizeX, bmp->sizeY); bmp++; diff --git a/src/game/sprput.c b/src/game/sprput.c index 44f750e1..075ab771 100644 --- a/src/game/sprput.c +++ b/src/game/sprput.c @@ -1,4 +1,6 @@ #include "common.h" +#include "game/sprite.h" +#include "game/init.h" #include "dolphin/mtx.h" #include "dolphin/gx.h" #include "dolphin/vi.h" @@ -8,7 +10,6 @@ static short HuSprLayerDrawNo[8]; static short bmpCCIdx; - void mtxTransCat(Mtx matrix, float x, float y, float z); static void HuSprLayerHook(short layer); @@ -47,9 +48,10 @@ void HuSprDisp(SpriteData *sprite) Vec axis = {0, 0, 1}; Mtx modelview, rot; short color_sum; - void (*func)(SpriteData *); + SpriteFunc func; + GXSetScissor(sprite->scissor_x, sprite->scissor_y, sprite->scissor_w, sprite->scissor_h); - if(sprite->attr & 0x10) { + if(sprite->attr & SPRITE_ATTR_FUNC) { if(sprite->func) { func = sprite->func; func(sprite); @@ -78,9 +80,9 @@ void HuSprDisp(SpriteData *sprite) GXSetTevOp(GX_TEVSTAGE0, GX_MODULATE); GXSetNumChans(1); GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_REG, GX_LIGHT0, GX_DF_CLAMP, GX_AF_SPOT); - if(sprite->attr & 0x80) { + if(sprite->attr & SPRITE_ATTR_ADDITIVE) { GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP); - } else if(sprite->attr & 0x100) { + } else if(sprite->attr & SPRITE_ATTR_INVERT) { GXSetBlendMode(GX_BM_BLEND, GX_BL_ZERO, GX_BL_INVDSTCLR, GX_LO_NOOP); } else { GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); @@ -121,8 +123,8 @@ void HuSprDisp(SpriteData *sprite) continue; } GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); - HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & 0x8) ? 1 : 0); - if(layer->alpha != 0xFF || color_sum != 1020) { + HuSprTexLoad(anim, layer->bmpNo, 0, sprite->wrap_s, sprite->wrap_t, (sprite->attr & SPIRTE_ATTR_BILINEAR) ? GX_LINEAR : GX_NEAR); + if(layer->alpha != 255 || color_sum != 255*4) { color.a = (u16)(sprite->a*layer->alpha) >> 8; GXSetTevColor(GX_TEVSTAGE1, color); GXSetNumTevStages(2); @@ -138,14 +140,14 @@ void HuSprDisp(SpriteData *sprite) pos[2][1] = layer->vtx[5]-pat->centerY; pos[3][0] = layer->vtx[6]-pat->centerX; pos[3][1] = layer->vtx[7]-pat->centerY; - if(layer->flip & 0x1) { + if(layer->flip & SPRITE_LAYER_FLIPX) { texcoord_x2 = layer->startX/(float)bmp->sizeX; texcoord_x1 = (layer->startX+layer->sizeX)/(float)bmp->sizeX; } else { texcoord_x1 = layer->startX/(float)bmp->sizeX; texcoord_x2 = (layer->startX+layer->sizeX)/(float)bmp->sizeX; } - if(layer->flip & 0x2) { + if(layer->flip & SPRITE_LAYER_FLIPY) { texcoord_y2 = layer->startY/(float)bmp->sizeY; texcoord_y1 = (layer->startY+layer->sizeY)/(float)bmp->sizeY; } else { @@ -186,49 +188,49 @@ void HuSprTexLoad(AnimData *anim, short bmp, short slot, GXTexWrapMode wrap_s, G AnimBmpData *bmp_ptr = &anim->bmp[bmp]; short sizeX = bmp_ptr->sizeX; short sizeY = bmp_ptr->sizeY; - switch(bmp_ptr->dataFmt & 0xF) { - case 0: + switch(bmp_ptr->dataFmt & SPRITE_BMP_FMTMASK) { + case SPRITE_BMP_RGBA8: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_RGBA8, wrap_s, wrap_t, GX_FALSE); break; - case 1: - case 2: + case SPRITE_BMP_RGB5A3: + case SPRITE_BMP_RGB5A3_DUPE: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_RGB5A3, wrap_s, wrap_t, GX_FALSE); break; - case 3: + case SPRITE_BMP_C8: GXInitTlutObj(&tlut_obj, bmp_ptr->palData, GX_TL_RGB5A3, bmp_ptr->palNum); GXLoadTlut(&tlut_obj, slot); GXInitTexObjCI(&tex_obj,bmp_ptr->data, sizeX, sizeY, GX_TF_C8, wrap_s, wrap_t, GX_FALSE, slot); break; - case 4: + case SPRITE_BMP_C4: GXInitTlutObj(&tlut_obj, bmp_ptr->palData, GX_TL_RGB5A3, bmp_ptr->palNum); GXLoadTlut(&tlut_obj, slot); GXInitTexObjCI(&tex_obj,bmp_ptr->data, sizeX, sizeY, GX_TF_C4, wrap_s, wrap_t, GX_FALSE, slot); break; - case 5: + case SPRITE_BMP_IA8: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_IA8, wrap_s, wrap_t, GX_FALSE); break; - case 6: + case SPRITE_BMP_IA4: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_IA4, wrap_s, wrap_t, GX_FALSE); break; - case 7: + case SPRITE_BMP_I8: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_I8, wrap_s, wrap_t, GX_FALSE); break; - case 8: + case SPRITE_BMP_I4: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_I4, wrap_s, wrap_t, GX_FALSE); break; - case 9: + case SPRITE_BMP_A8: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_CTF_A8, wrap_s, wrap_t, GX_FALSE); break; - case 10: + case SPRITE_BMP_CMPR: GXInitTexObj(&tex_obj, bmp_ptr->data, sizeX, sizeY, GX_TF_CMPR, wrap_s, wrap_t, GX_FALSE); break;