#include "common.h" #include "model.h" #include "ld_addrs.h" typedef struct GameMode { /* 0x00 */ u16 flags; /* 0x04 */ void (*init)(void); /* 0x08 */ void (*step)(void); /* 0x0C */ UNK_FUN_PTR(unk_0C); /* 0x10 */ void (*render)(void); /* 0x14 */ void (*renderAux)(void); ///< @see state_render_frontUI } GameMode; // size = 0x18 typedef struct Fog { /* 0x00 */ s32 enabled; /* 0x04 */ s32 r; /* 0x08 */ s32 g; /* 0x0C */ s32 b; /* 0x10 */ s32 a; /* 0x14 */ s32 startDistance; /* 0x18 */ s32 endDistance; } Fog; // size = 0x1C extern Gfx D_8014B7F8[]; extern Gfx D_8014B820[]; extern Gfx D_8014B848[]; extern Gfx D_8014B870[]; extern Gfx D_8014B898[]; extern Gfx D_8014B8C0[]; extern Gfx D_8014B8E8[]; extern Gfx D_8014B910[]; extern Gfx D_8014B938[]; extern Gfx D_8014B960[]; extern Gfx D_8014B988[]; extern Gfx D_8014B9B0[]; extern Gfx D_8014B9D8[]; extern Gfx D_8014BA00[]; extern Gfx D_8014BA20[]; extern Gfx D_8014BA48[]; extern Gfx D_8014BA70[]; extern Gfx D_8014BA98[]; extern Gfx D_8014BAC0[]; extern Gfx D_8014BAE8[]; extern Gfx D_8014BB10[]; extern Gfx D_8014BB38[]; extern Gfx D_8014BB60[]; extern Gfx D_8014BB88[]; extern Gfx D_8014BBB0[]; extern Gfx D_8014BBD8[]; extern Gfx D_8014BC00[]; extern Gfx D_8014BC28[]; extern Gfx D_8014BC50[]; extern Gfx D_8014BC78[]; extern Gfx D_8014BCA0[]; extern Gfx D_8014BCC8[]; extern Gfx D_8014BCF8[]; extern Gfx D_8014BD18[]; extern Gfx D_8014BD40[]; extern Gfx D_8014BD68[]; extern Gfx D_8014BD88[]; extern Gfx D_8014BDB0[]; extern Gfx D_8014BDD8[]; extern Gfx D_8014BE00[]; extern Gfx D_8014BE28[]; extern Gfx D_8014BE50[]; extern Gfx D_8014BE78[]; extern Gfx D_8014BEA0[]; extern Gfx D_8014BEC8[]; extern Gfx D_8014BEF0[]; extern Gfx D_8014BF18[]; extern Gfx D_8014BF40[]; extern Gfx D_8014BF68[]; extern Gfx D_8014BF90[]; extern Gfx D_8014BFB8[]; extern Gfx D_8014BFE0[]; extern Gfx D_8014C008[]; extern Gfx D_8014C028[]; extern Gfx D_8014C050[]; extern Gfx D_8014C078[]; extern Gfx D_8014C098[]; extern Gfx D_8014C0C0[]; extern Gfx D_8014C0E8[]; extern Gfx D_8014C110[]; extern Gfx D_8014C138[]; extern Gfx D_8014C160[]; s32 D_8014AFB0 = 0xFF; s32 D_8014AFB4[] = {0, 0, 0}; Gfx* D_8014AFC0[] = { D_8014B7F8, D_8014B910, D_8014B820, D_8014B938, D_8014B848, D_8014B960, D_8014B870, D_8014B988, D_8014B898, D_8014BA20, D_8014B9B0, D_8014BAC0, D_8014B8C0, D_8014B9D8, D_8014B8E8, D_8014BA00 }; Gfx* D_8014B000[] = { D_8014BB60, D_8014BC78, D_8014BB88, D_8014BCA0, D_8014BBB0, D_8014BCC8, D_8014BBD8, D_8014BCF8, D_8014BC00, D_8014BD88, D_8014BD18, D_8014BC28, D_8014BD40, D_8014BC50, D_8014BD68, D_8014BE78, D_8014BF90, D_8014BEA0, D_8014BFB8, D_8014BEC8, D_8014BFE0, D_8014BEF0, D_8014C008, D_8014BF18, D_8014C098, D_8014C028, D_8014BF40, D_8014C050, D_8014BF68, D_8014C078, D_8014BA48, D_8014BA70, D_8014BA98, D_8014BDB0, D_8014BDD8, D_8014BE00, D_8014C0C0, D_8014C0E8, D_8014C110, D_8014BB10, D_8014BB38, D_8014BE28, D_8014BE50, D_8014C138, D_8014C160, NULL }; s32 D_8014B0B8 = 0xFCFFFFFF; s32 D_8014B0BC[] = { 0xFFFE793C, 0xFCFFFFFF, 0xFFFE7838, 0xFCFFFFFF, 0xFFFE7838, 0xFC457FFF, 0xFFFDF838, 0xFC41FFFF, 0xFFFEF838, 0xFC121824, 0xFF33FFFF, 0xFC127FFF, 0xFFFFF238, 0xFC1219FF, 0xFFFFFE38, 0xFC127E0A, 0xF3FFF238, 0xFC121803, 0xFFFFFF78, 0xFC147E28, 0x44FE793C, 0xFC147FFF, 0x4FFE7838, 0xFC147FFF, 0x4FFE7838, 0xFC147E0A, 0x4FFE72F8, 0xFC147E03, 0x4FFE7978, 0xFCFFFFFF, 0xFFFCF279, 0xFCFFFFFF, 0xFFFCF238, 0xFCFFFFFF, 0xFFFCF238, 0xFC157FFF, 0xFFFDF238, 0xFCFFFE03, 0xFFFCF378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFF13FFFF, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFF13FFFF, 0xFC20A204, 0xFF13FFFF, 0xFC20A203, 0xFF13FF7F, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF9883, 0xFFFFAF78, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FE03, 0x2FFD7378, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61FEC3, 0x11FCF279, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FE03, 0x1FFCF378, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, }; s32 D_8014B400 = 0xFCFFFFFF; s32 D_8014B404[] = { 0xFFFE793C, 0xFCFFFFFF, 0xFFFE7838, 0xFCFFFFFF, 0xFFFE7838, 0xFC457FFF, 0xFFFDF838, 0xFC41FFFF, 0xFFFEF838, 0xFC127E24, 0xFFFFF3F9, 0xFC127FFF, 0xFFFFF238, 0xFC127FFF, 0xFFFFF238, 0xFC127E0A, 0xF3FFF238, 0xFC127E03, 0xFFFFF378, 0xFC147E28, 0x44FE793C, 0xFC147FFF, 0x4FFE7838, 0xFC147FFF, 0x4FFE7838, 0xFC147E0A, 0x4FFE72F8, 0xFC147E03, 0x4FFE7978, 0xFCFFFFFF, 0xFFFCF279, 0xFCFFFFFF, 0xFFFCF238, 0xFCFFFFFF, 0xFFFCF238, 0xFC157FFF, 0xFFFDF238, 0xFCFFFE03, 0xFFFCF378, 0xFC26A004, 0x1FFC93FC, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1FFC93FC, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC93F8, 0xFC26A004, 0x1F1093FF, 0xFC26A004, 0x1FFC92F8, 0xFC26A003, 0x1FFC9378, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFF13FF7F, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFC20A204, 0xFFFFFFF8, 0xFC111404, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A204, 0xFFFFFFF8, 0xFC20A203, 0xFFFFFF78, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF99FF, 0xFFFFAF38, 0xFCFF9883, 0xFFFFAF78, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FFFF, 0x2FFD7238, 0xFC15FE03, 0x2FFD7378, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61E4C1, 0x12FC9238, 0xFC61FEC3, 0x11FCF279, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FFFF, 0x1FFCF238, 0xFC61FE03, 0x1FFCF378, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC10E228, 0x40C8A449, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, 0xFC75FEEB, 0xFFFFFDFE, }; u32 mdl_textureBaseAddress = 0x8028E000; s8 mdl_bgMultiplyColorA = 0; s8 mdl_bgMultiplyColorR = 0; s8 mdl_bgMultiplyColorG = 0; s8 mdl_bgMultiplyColorB = 0; s8 mdl_renderModelFogPrimColorR = 0; s8 mdl_renderModelFogPrimColorG = 0; s8 mdl_renderModelFogPrimColorB = 0; s8 mdl_renderModelFogPrimColorA = 0; s8 mdl_renderModelFogColorR = 0; s8 mdl_renderModelFogColorG = 0; s8 mdl_renderModelFogColorB = 0; s8 mdl_renderModelFogColorA = 0; // unused? s32 mdl_renderModelFogStart = 950; s32 mdl_renderModelFogEnd = 1000; s8 gRenderModelPrimR = 255; s8 gRenderModelPrimG = 255; s8 gRenderModelPrimB = 255; s8 gRenderModelEnvR = 0; s8 gRenderModelEnvG = 0; s8 gRenderModelEnvB = 0; s8 D_8014B766 = 0; s8 D_8014B767 = 0; Matrix4s mdl_RDPIdentity = { .whole = { {1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0}, {0, 0, 0, 1} }, .frac = { {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0} } }; s32 D_8014B7A8[] = { 0x00000006, 0x00000000, 0x00000005, 0x00020000, 0x00000004, 0x00030000, 0x00000003, 0x00038000, 0x00000002, 0x0003C000, 0x00000001, 0x0003E000, 0x00000000, 0x0003F000, 0x00000000, 0x0003F800, 0x00000000, 0x00000000, }; s32 D_8014B7F0[] = { 0x00000000, 0x00000000, }; Gfx D_8014B7F8[] = { gsDPSetRenderMode(G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B820[] = { gsDPSetRenderMode(G_RM_AA_ZB_OPA_DECAL, G_RM_AA_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B848[] = { gsDPSetRenderMode(G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_OPA_INTER2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B870[] = { gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B898[] = { gsDPSetRenderMode(G_RM_AA_ZB_XLU_SURF, G_RM_AA_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B8C0[] = { gsDPSetRenderMode(G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B8E8[] = { gsDPSetRenderMode(G_RM_AA_ZB_XLU_INTER, G_RM_AA_ZB_XLU_INTER2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B910[] = { gsDPSetRenderMode(G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B938[] = { gsDPSetRenderMode(G_RM_ZB_OPA_DECAL, G_RM_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B960[] = { gsDPSetRenderMode(G_RM_AA_ZB_OPA_INTER, G_RM_AA_ZB_OPA_INTER2), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), gsSPEndDisplayList(), }; Gfx D_8014B988[] = { gsDPSetRenderMode(G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B9B0[] = { gsDPSetRenderMode(G_RM_ZB_XLU_SURF, G_RM_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014B9D8[] = { gsDPSetRenderMode(G_RM_ZB_OVL_SURF, G_RM_ZB_OVL_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BA00[] = { gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BA20[] = { gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BA48[] = { gsDPSetRenderMode(G_RM_AA_OPA_SURF, G_RM_AA_OPA_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BA70[] = { gsDPSetRenderMode(G_RM_AA_TEX_EDGE, G_RM_AA_TEX_EDGE2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BA98[] = { gsDPSetRenderMode(G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BAC0[] = { gsDPSetRenderMode(AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BAE8[] = { gsDPSetRenderMode(IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), IM_RD | CVG_DST_SAVE | ZMODE_XLU | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BB10[] = { gsDPSetRenderMode(G_RM_ZB_CLD_SURF, G_RM_ZB_CLD_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BB38[] = { gsDPSetRenderMode(G_RM_CLD_SURF, G_RM_CLD_SURF2), gsDPSetCycleType(G_CYC_1CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BB60[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BB88[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BBB0[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BBD8[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BC00[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BC28[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BC50[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BC78[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BCA0[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BCC8[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_OPA_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsDPSetCombineMode(G_CC_SHADE, G_CC_SHADE), gsSPEndDisplayList(), }; Gfx D_8014BCF8[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BD18[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BD40[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_XLU_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BD68[] = { gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BD88[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BDB0[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BDD8[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BE00[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_AA_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BE28[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_ZB_CLD_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BE50[] = { gsDPSetRenderMode(G_RM_PASS, G_RM_CLD_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BE78[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BEA0[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BEC8[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BEF0[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BF18[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BF40[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BF68[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BF90[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BFB8[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_OPA_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014BFE0[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_INTER2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C008[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C028[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C050[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_XLU_DECAL2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C078[] = { gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C098[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C0C0[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_OPA_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C0E8[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_TEX_EDGE2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C110[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_XLU_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C138[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_CLD_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; Gfx D_8014C160[] = { gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_CLD_SURF2), gsDPSetCycleType(G_CYC_2CYCLE), gsSPClearGeometryMode(G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | G_TEXTURE_GEN_LINEAR | G_LOD | G_SHADING_SMOOTH), gsSPSetGeometryMode(G_ZBUFFER | G_SHADE | G_LIGHTING | G_SHADING_SMOOTH), gsSPEndDisplayList(), }; s32 D_8014C188[] = { 0xFFFE7960, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x000F4240, 0x000F4240, 0x000F4240, 0x00000000, 0x007A1200, 0x007A1200, 0x007A1200, 0x00000000, 0x007A1200, 0x007270E0, 0x007270E0, 0x007270E0, 0x00000000, 0x006ACFC0, 0x006ACFC0, 0x006ACFC0, 0x006ACFC0, 0x00632EA0, 0x00632EA0, 0x00632EA0, 0x00000000, 0x005B8D80, 0x005B8D80, 0x005B8D80, 0x00000000, 0x0053EC60, 0x0053EC60, 0x0053EC60, 0x007A1200, 0x003D0900, 0x0040D990, 0x0044AA20, 0x0044AA20, 0x007A1200, 0x000AAE60, }; // render mode -> distance map? s8 D_8014C248[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; // TODO BSS to sort out extern ModelNode** gCurrentModelTreeRoot; extern ModelTransformGroupList wTransformGroups; extern ModelTransformGroupList bTransformGroups; // BSS static s32 B_801512B0[2]; static ModelCustomGfxBuilderList* gCurrentCustomModelGfxBuildersPtr; static s32 D_801512BC; static s32 D_801512C0; static s32 gEntityHeapBase; static s32 D_801512C8; BSS ModelList* gCurrentModels; static s32 D_801512D0[4]; static ModelTransformGroupList* gCurrentTransformGroups; static s8 gMsgGlobalWaveCounter[0x4]; static ModelCustomGfxList* gCurrentCustomModelGfxPtr; static s32 gLastCreatedEntityIndex; static s8 B_801512F0[0x410]; static GameMode gMainGameState[2]; // TODO rename extern s32 D_80151324; extern s32 D_8015132C; extern s32 D_80151330; extern s32 wStaticEntityDataSize; extern s32 bStaticEntityDataSize; extern StaticEntityData* wStaticEntityData[30]; extern StaticEntityData* bStaticEntityData[4]; extern TileDescriptor gCurrentTileDescriptor; extern ModelList wModelList; extern ModelList bModelList; extern ModelCustomGfxList wModelSpecialDls; extern ModelCustomGfxList bModelSpecialDls; extern ModelCustomGfxBuilderList wCustomModelGfxBuilders; extern ModelCustomGfxBuilderList bCustomModelGfxBuilders; extern ModelLocalVertexCopy** D_80152190; extern ModelLocalVertexCopy** D_801521D0; extern ModelLocalVertexCopy** gCurrentModelLocalVtxBuffers; extern ModelNode* D_80152214; extern ModelNode* D_80152218; extern ModelTreeInfoList D_80152220; extern ModelTreeInfoList D_80152A20; extern s8 wBgRenderType; extern s8 bBgRenderType; extern s32 mdl_treeIterPos; extern Fog wFogSettings; extern Fog bFogSettings; extern Fog* gCurrentFogSettings; extern s32 texPannerMainU[MAX_TEX_PANNERS]; extern s32 texPannerMainV[MAX_TEX_PANNERS]; extern s32 texPannerAuxU[MAX_TEX_PANNERS]; extern s32 texPannerAuxV[MAX_TEX_PANNERS]; extern u32 mdl_nextTextureAddress; extern u16 mdl_currentTransformGroupChildIndex; extern ModelNode* D_80153370; extern u16 D_80153374; extern u16 D_80153376; extern s16 D_8015336E; extern RenderTask* mdl_renderTaskLists[3]; extern s32 mdl_renderTaskMode; extern s32 mdl_renderTaskCount; // num render task entries? extern s8 D_8015A578; extern TextureHandle mdl_textureHandles[128]; extern RenderTask mdl_clearRenderTasks[3][0x100]; void update_shadows(void); s32 step_entity_commandlist(Entity* entity); void render_shadows(void); void update_entity_transform_matrix(Entity* entity); void update_shadow_transform_matrix(Shadow* shadow); void update_entity_inverse_rotation_matrix(Entity* entity); void delete_entity(s32 entityIndex); void delete_entity_and_unload_data(s32 entityIndex); void _delete_shadow(s32 shadowIndex); s32 entity_get_collision_flags(Entity* entity); void entity_free_static_data(StaticEntityData* data); void update_entity_shadow_position(Entity* entity); s32 entity_raycast_down(f32* x, f32* y, f32* z, f32* hitYaw, f32* hitPitch, f32* hitLength); void load_model_transforms(ModelNode* model, ModelNode* parent, Matrix4f mdlTxMtx, s32 treeDepth); void enable_transform_group(u16 modelID); void update_entities(void) { s32 i; D_801512BC = 0; D_801512C0 = 0; D_80151330++; for (i = 0; i < MAX_ENTITIES; i++) { Entity* entity = get_entity_by_index(i); if (entity != NULL) { D_801512C0++; if (!(entity->flags & 0x40000000)) { if (entity->flags & 0x1000000) { entity->flags &= ~0x1000000; if (!(entity->flags & 0x8000)) { entity->flags |= 0x2000000; } entity->boundScript = start_script(entity->boundScriptBytecode, 0xA, 0x20); } if (entity->flags & 0x2000000) { if (does_script_exist(entity->boundScript->id)) { if (entity->flags & 8) { update_model_animator(entity->virtualModelIndex); } else { exec_entity_model_commandlist(entity->virtualModelIndex); } if (entity->flags & 0x2000) { entity->rotation.y = -gCameras[gCurrentCameraID].currentYaw; } if (!(entity->flags & 0x10)) { update_entity_transform_matrix(entity); } continue; } else { entity->flags &= ~0x2000000; } } if (entity->unk_07 == 0) { entity->collisionFlags = entity_get_collision_flags(entity); if (entity->collisionFlags) { EntityCallback entityCallback = entity->staticData->unk_data_ptr2; if (entityCallback != NULL && entityCallback(entity) != 0) { entity->unk_07 = 0xA; entity->flags |= 0x10000; } } } else { entity->unk_07--; if (entity->flags & 0x40) { if (entity->unk_07 == 0) { entity->flags &= ~0x60; } else { entity->flags |= 0x20; } } else if (entity->unk_07 == 0) { entity->flags &= ~0x10000; entity->flags &= ~0x20000; entity->collisionFlags = 0; } } if (entity->flags & 0x2000) { entity->rotation.y = -gCameras[gCurrentCameraID].currentYaw; } if (!gGameStatusPtr->disableScripts) { if (entity->updateScriptCallback != NULL) { entity->updateScriptCallback(entity); } if (entity->scriptReadPos != NULL) { if (entity->hasEntityScript) { entity->hasEntityScript--; if (!(entity->hasEntityScript)) { while (step_entity_commandlist(entity)); } } } } if (!(entity->flags & 0x10)) { update_entity_transform_matrix(entity); } if (!(entity->flags & 0x20)) { update_entity_inverse_rotation_matrix(entity); } if (entity->flags & 8) { update_model_animator(entity->virtualModelIndex); } else { exec_entity_model_commandlist(entity->virtualModelIndex); } if (entity->shadowIndex >= 0) { update_entity_shadow_position(entity); } if (entity->flags & 0x20000000) { delete_entity(entity->listIndex); } if (entity->flags & 0x4000000) { delete_entity_and_unload_data(entity->listIndex); } } } } update_shadows(); D_8015A578 = 0; } void update_shadows(void) { s32 i; D_80151324 = 0; for (i = 0; i < MAX_SHADOWS; i++) { Shadow* shadow = get_shadow_by_index(i); if (shadow != NULL) { D_80151324++; if (!(shadow->flags & 0x40000000)) { if (shadow->flags & 0x2000) { shadow->rotation.y = -gCameras[gCurrentCameraID].currentYaw; } update_shadow_transform_matrix(shadow); if (shadow->flags & 8) { update_model_animator(shadow->entityModelID); } else { exec_entity_model_commandlist(shadow->entityModelID); } if (shadow->flags & 0x20000000) { _delete_shadow(shadow->listIndex); } } } } } void set_entity_commandlist(Entity* entity, s32* entityScript) { entity->scriptReadPos = entityScript; entity->hasEntityScript = TRUE; entity->savedReadPos = entity->scriptReadPos; } // Ordering issues with the savedReadPos cases (4 and 5) #ifdef NON_MATCHING s32 step_entity_commandlist(Entity* entity) { s32* args = entity->scriptReadPos; s32 ret; s32 a1; s32 (*tempfunc)(Entity*); switch (*args++) { case 0: entity->hasEntityScript = -1; entity->updateScriptCallback = NULL; entity->scriptReadPos = NULL; ret = FALSE; break; case 1: entity->scriptReadPos = *args; entity->hasEntityScript = 1; entity->savedReadPos = entity->scriptReadPos; ret = TRUE; break; case 2: tempfunc = *args++; entity->scriptReadPos = args; (tempfunc)(entity); ret = TRUE; break; case 3: entity->hasEntityScript = *args++; entity->updateScriptCallback = (s32 (*)(Entity*)) *args++; entity->scriptReadPos = args++; ret = FALSE; break; case 4: entity->scriptReadPos = entity->savedReadPos[*args++]; ret = TRUE; break; case 5: a1 = *args++; entity->savedReadPos[a1] = args; entity->scriptReadPos = args; ret = TRUE; break; case 6: if (entity->boundScriptBytecode != NULL) { entity->flags |= 0x1000000; } entity->scriptReadPos = args++; ret = TRUE; break; case 7: entity->flags |= *args++; entity->scriptReadPos = args++; ret = TRUE; break; case 8: entity->flags &= ~*args++; entity->scriptReadPos = args++; ret = TRUE; break; case 9: sfx_play_sound(*args++); entity->scriptReadPos = args++; ret = TRUE; break; default: args++; entity->scriptReadPos = args++; ret = TRUE; break; } return ret; } #else INCLUDE_ASM(s32, "a5dd0_len_114e0", step_entity_commandlist, Entity* entity); #endif void exec_entity_commandlist(Entity* entity) { while (step_entity_commandlist(entity)); } void func_8010FD98(s32 arg0, s32 alpha) { if (alpha >= 255) { gDPSetRenderMode(gMasterGfxPos++, G_RM_AA_ZB_OPA_SURF, G_RM_AA_ZB_OPA_SURF2); gDPSetCombineMode(gMasterGfxPos++, G_CC_MODULATEIA, G_CC_MODULATEIA); } else { gDPSetCombineLERP(gMasterGfxPos++, 0, 0, 0, TEXEL0, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, TEXEL0, TEXEL0, 0, PRIMITIVE, 0); gDPSetPrimColor(gMasterGfxPos++, 0, 0, 0x00, 0x00, 0x00, alpha); } } void func_8010FE44(s32 arg0) { func_8010FD98(arg0, D_8014AFB0); } void entity_model_set_shadow_color(s32 alpha) { gDPSetCombineLERP(gMasterGfxPos++, 0, 0, 0, 0, PRIMITIVE, 0, TEXEL0, 0, 0, 0, 0, 0, TEXEL0, 0, PRIMITIVE, 0); gDPSetPrimColor(gMasterGfxPos++, 0, 0, 0x00, 0x00, 0x00, alpha); } void render_entities(void) { s32 i; for (i = 0; i < MAX_ENTITIES; i++) { Entity* entity = get_entity_by_index(i); if (entity != NULL) { if (!gGameStatusPtr->isBattle) { if (D_80151310 != 0 && !(entity->flags & 0x80000) && dist2D(gPlayerStatusPtr->position.x, gPlayerStatusPtr->position.z, entity->position.x, entity->position.z) > 200.0f ) { continue; } if (D_80151310 == 1) { if (!(entity->flags & 2)) { continue; } } else if (D_80151310 == 2) { if (!(entity->flags & 0x40000)) { continue; } } } if (!(entity->flags & 1)) { if (entity->flags & 8) { if (D_8014AFB0 == 0xFF) { if (entity->renderSetupFunc != NULL) { set_animator_render_callback(entity->virtualModelIndex, entity->listIndex, entity->renderSetupFunc); } } else { set_animator_render_callback(entity->virtualModelIndex, entity->listIndex, func_8010FE44); } if (entity->vertexData == NULL) { render_animated_model(entity->virtualModelIndex, &entity->transformMatrix); } else { render_animated_model_with_vertices(entity->virtualModelIndex, &entity->transformMatrix, entity->vertexSegment, entity->vertexData); } } else { if (D_8014AFB0 == 0xFF) { if (entity->renderSetupFunc != NULL) { bind_entity_model_setupGfx(entity->virtualModelIndex, entity->listIndex, entity->renderSetupFunc); } else { get_entity_model(entity->virtualModelIndex)->fpSetupGfxCallback = NULL; } } else { bind_entity_model_setupGfx(entity->virtualModelIndex, entity->listIndex, func_8010FE44); } if (entity->vertexData == NULL) { draw_entity_model_A(entity->virtualModelIndex, &entity->transformMatrix); } else { draw_entity_model_B(entity->virtualModelIndex, &entity->transformMatrix, entity->vertexSegment, entity->vertexData); } } } } } render_shadows(); } void render_shadows(void) { s32 i; for (i = 0; i < MAX_SHADOWS; i++) { Shadow* shadow = get_shadow_by_index(i); if (shadow != NULL) { if (shadow->flags & 1) { if (shadow->flags & 0x10000000) { shadow->unk_05 -= 20; if (shadow->unk_05 <= 20) { shadow->flags |= 0x20000000; } } } else if (shadow->flags & 8) { if (shadow->vertexArray == NULL) { render_animated_model(shadow->entityModelID, &shadow->transformMatrix); } else { render_animated_model_with_vertices(shadow->entityModelID, &shadow->transformMatrix, shadow->vertexSegment, shadow->vertexArray); } } else { if (shadow->flags & 0x10000000) { shadow->unk_05 -= 20; if (shadow->unk_05 <= 20) { shadow->flags |= 0x20000000; } } bind_entity_model_setupGfx(shadow->entityModelID, shadow->unk_05, entity_model_set_shadow_color); if (shadow->vertexArray == NULL) { draw_entity_model_A(shadow->entityModelID, &shadow->transformMatrix); } else { draw_entity_model_B(shadow->entityModelID, &shadow->transformMatrix, shadow->vertexSegment, shadow->vertexArray); } } } } } INCLUDE_ASM(void, "a5dd0_len_114e0", update_entity_transform_matrix, Entity* entity); INCLUDE_ASM(void, "a5dd0_len_114e0", update_shadow_transform_matrix, Shadow* shadow); INCLUDE_ASM(void, "a5dd0_len_114e0", update_entity_inverse_rotation_matrix, Entity* entity); Entity* get_entity_by_index(s32 index) { return (*gCurrentEntityListPtr)[index & 0xFFF]; } Shadow* get_shadow_by_index(s32 index) { return (*gCurrentShadowListPtr)[index & 0xFFF]; } EntityList* get_entity_list(void) { EntityList* ret; if (!gGameStatusPtr->isBattle) { ret = &gWorldEntityList; } else { ret = &gBattleEntityList; } return ret; } ShadowList* get_shadow_list(void) { ShadowList* ret; if (!gGameStatusPtr->isBattle) { ret = &gWorldShadowList; } else { ret = &gBattleShadowList; } return ret; } s32 entity_start_script(Entity* entity) { if (entity->boundScriptBytecode != NULL) { entity->flags |= 0x1000000; return 1; } return 0; } u32 get_entity_type(s32 index) { Entity* entity = get_entity_by_index(index); if (entity == NULL) { return -1; } else { return entity->staticData->entityType; } } void delete_entity(s32 entityIndex) { Entity* entity = get_entity_by_index(entityIndex); if (entity->dataBuf != NULL) { heap_free(entity->dataBuf); } if (!(entity->flags & 8)) { free_entity_model_by_index(entity->virtualModelIndex); } else { delete_model_animator(get_animator_by_index(entity->virtualModelIndex)); } if (entity->shadowIndex >= 0) { Shadow* shadow = get_shadow_by_index(entity->shadowIndex); shadow->flags |= 0x10000000; } heap_free((*gCurrentEntityListPtr)[entityIndex]); (*gCurrentEntityListPtr)[entityIndex] = NULL; } void delete_entity_and_unload_data(s32 entityIndex) { Entity* entity = get_entity_by_index(entityIndex); if (entity->dataBuf != NULL) { heap_free(entity->dataBuf); } if (!(entity->flags & 8)) { free_entity_model_by_index(entity->virtualModelIndex); } else { delete_model_animator(get_animator_by_index(entity->virtualModelIndex)); } entity_free_static_data(entity->staticData); if (entity->shadowIndex >= 0) { Shadow* shadow = get_shadow_by_index(entity->shadowIndex); shadow->flags |= 0x10000000; } heap_free((*gCurrentEntityListPtr)[entityIndex]); (*gCurrentEntityListPtr)[entityIndex] = NULL; } void _delete_shadow(s32 shadowIndex) { Shadow* shadow = get_shadow_by_index(shadowIndex); free_entity_model_by_index(shadow->entityModelID); heap_free((*gCurrentShadowListPtr)[shadowIndex]); (*gCurrentShadowListPtr)[shadowIndex] = NULL; } s32 entity_get_collision_flags(Entity* entity) { u32 listIndex = entity->listIndex; s32 ret = 0; u32 flag; if (entity->flags & 0x20000) { ret = 0x80; entity->flags &= ~0x20000; } flag = gCollisionStatus.currentFloor; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) { ret |= 1; } flag = gCollisionStatus.lastTouchedFloor; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) { ret |= 0x100; } flag = gCollisionStatus.currentCeiling; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) { ret |= 0x4; } flag = gCollisionStatus.pushingAgainstWall; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) { ret |= 0x10; } flag = gCollisionStatus.lastWallHammered; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag) { ret |= 0x40; } flag = gCollisionStatus.currentWall; if (flag != -1 && (flag & 0x4000) && listIndex == (u8)flag && gPlayerStatusPtr->pressedButtons & 0x8000) { ret |= 8; } return ret; } INCLUDE_ASM(s32, "a5dd0_len_114e0", entity_interacts_with_current_partner); // float bs #ifdef NON_MATCHING s32 test_player_entity_aabb(Entity* entity) { f32 temp_f4; f32 colliderDiameter; temp_f4 = entity->position.y - (gPlayerStatus.position.y + gPlayerStatus.colliderHeight); if (temp_f4 > 0.0f || gPlayerStatus.colliderHeight + entity->aabb.y < fabsf(temp_f4)) { return 0; } if ((gPlayerStatus.colliderDiameter + entity->aabb.x) * 0.5 < fabsf(gPlayerStatus.position.x - entity->position.x)) { return 0; } if ((gPlayerStatus.colliderDiameter + entity->aabb.z) * 0.5 < fabsf(gPlayerStatus.position.z - entity->position.z)) { return 0; } return 1; } #else INCLUDE_ASM(s32, "a5dd0_len_114e0", test_player_entity_aabb); #endif s32 is_player_action_state(s8 actionState) { return actionState == gPlayerActionState; } void entity_set_render_script(Entity* entity, u32* commandList) { if (!(entity->flags & 8)) { set_entity_model_render_command_list(entity->virtualModelIndex, commandList); } } void func_80110BF8(Entity* entity) { entity->unk_07 = 0; entity->flags &= ~0x00010000; } #ifdef NON_MATCHING #define AREA_SPECIFIC_ENTITY_VRAM &entity_default_VRAM #else #define AREA_SPECIFIC_ENTITY_VRAM 0x802BAE00 #endif void load_area_specific_entity_data(void) { if (D_8015132C == 0) { if (gGameStatusPtr->areaID == AREA_JAN || gGameStatusPtr->areaID == AREA_IWA) { dma_copy(entity_jan_iwa_ROM_START, entity_jan_iwa_ROM_END, AREA_SPECIFIC_ENTITY_VRAM); } else if (gGameStatusPtr->areaID == AREA_SBK || gGameStatusPtr->areaID == AREA_OMO) { dma_copy(entity_sbk_omo_ROM_START, entity_sbk_omo_ROM_END, AREA_SPECIFIC_ENTITY_VRAM); } else { dma_copy(entity_default_ROM_START, entity_default_ROM_END, AREA_SPECIFIC_ENTITY_VRAM); } D_8015132C = 1; } } INCLUDE_ASM(s32, "a5dd0_len_114e0", clear_entity_data); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80110E58); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80110F10); INCLUDE_ASM(s32, "a5dd0_len_114e0", entity_anim_make_vertex_pointers); s32 is_entity_data_loaded(Entity* entity, StaticEntityData* entityData, s32* loadedStart, s32* loadedEnd); INCLUDE_ASM(s32, "a5dd0_len_114e0", is_entity_data_loaded); void load_simple_entity_data(Entity* entity, StaticEntityData* entityData) { s32 loadedStart; s32 loadedEnd; s32 entitySize; u32 temp; s32 sizeTemp; entity->vertexSegment = 10; if (!gGameStatusPtr->isBattle) { sizeTemp = wStaticEntityDataSize; } else { sizeTemp = bStaticEntityDataSize; } if (is_entity_data_loaded(entity, entityData, &loadedStart, &loadedEnd)) { if (sizeTemp + ((entityData->dmaEnd - entityData->dmaStart) >> 2) >= 0x5FFDU) { get_entity_type(entity->listIndex); get_entity_type(entity->listIndex); PANIC(); } entitySize = (entityData->dmaEnd - entityData->dmaStart) >> 2; entity->vertexData = (gEntityHeapBase - (sizeTemp * 4)) - (entitySize * 4); temp = dma_copy(entityData->dmaStart, entityData->dmaEnd, entity->vertexData); sizeTemp += temp / 4; get_entity_type(entity->listIndex); } else { entitySize = (entityData->dmaEnd - entityData->dmaStart) >> 2; entity->vertexData = (gEntityHeapBase - (loadedStart * 4)) - (entitySize * 4); get_entity_type(entity->listIndex); } if (!gGameStatusPtr->isBattle) { wStaticEntityDataSize = sizeTemp; } else { bStaticEntityDataSize = sizeTemp; } } INCLUDE_ASM(s32, "a5dd0_len_114e0", load_split_entity_data); s32 func_80111790(void) { s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentEntityListPtr); i++) { Entity* entity = (*gCurrentEntityListPtr)[i]; if (entity != NULL && entity->staticData->dmaStart != NULL) { if (entity->staticData->dmaStart == entity->staticData) { return TRUE; } } } return FALSE; } INCLUDE_ASM(void, "a5dd0_len_114e0", entity_free_static_data, StaticEntityData* data); INCLUDE_ASM(s32, "a5dd0_len_114e0", create_entity, StaticEntityData* data, s32 x, s32 y, s32 z, s32 arg4, ...); s32 create_shadow_from_data(StaticShadowData* data, f32 x, f32 y, f32 z) { Shadow* shadow; s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentShadowListPtr); i++) { if ((*gCurrentShadowListPtr)[i] == NULL) { break; } } ASSERT(i < ARRAY_COUNT(*gCurrentShadowListPtr)); shadow = heap_malloc(sizeof(*shadow)); (*gCurrentShadowListPtr)[i] = shadow; mem_clear(shadow, sizeof(*shadow)); shadow->listIndex = i; shadow->flags = data->flags | 0x80000000; shadow->unk_05 = 0x80; shadow->unk_06 = 0x80; shadow->position.x = x; shadow->position.y = y; shadow->position.z = z; shadow->scale.x = 1.0f; shadow->scale.y = 1.0f; shadow->scale.z = 1.0f; if (data->animModelNode != NULL) { shadow->flags |= 8; shadow->entityModelID = create_model_animator(data->unk_04); load_model_animator_tree(shadow->entityModelID, data->animModelNode); } else { shadow->entityModelID = load_entity_model(data->unk_04); } if (data->onCreateCallback != NULL) { data->onCreateCallback(shadow); } update_shadow_transform_matrix(shadow); return shadow->listIndex; } s32 MakeEntity(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; StaticEntityData* entityData; s32 x, y, z; s32 flags; s32 temp_v0; s32 entityIndex; s32 t80000000; s32* temp; if (isInitialCall != TRUE) { return ApiStatus_DONE2; } entityData = (StaticEntityData*)evt_get_variable(script, *args++); temp = &D_8015C7D0[2]; t80000000 = 0x80000000; x = evt_get_variable(script, *args++); y = evt_get_variable(script, *args++); z = evt_get_variable(script, *args++); flags = evt_get_variable(script, *args++); *temp-- = 0; *temp-- = 0; *temp = 0; do { temp_v0 = evt_get_variable(script, *args++); if (temp_v0 != t80000000) { *temp++ = temp_v0; } } while (temp_v0 != t80000000); entityIndex = create_entity(entityData, x, y, z, flags, D_8015C7D0[0], D_8015C7D0[1], D_8015C7D0[2], t80000000); gLastCreatedEntityIndex = entityIndex; script->varTable[0] = entityIndex; return ApiStatus_DONE2; } INCLUDE_ASM(s32, "a5dd0_len_114e0", SetEntityCullMode); ApiStatus UseDynamicShadow(Evt* script, s32 isInitialCall) { Entity* entity = get_entity_by_index(gLastCreatedEntityIndex); if (evt_get_variable(script, *script->ptrReadPos)) { Shadow* shadow; entity->flags |= 4; shadow = get_shadow_by_index(entity->shadowIndex); shadow->flags |= 0x400000; } else { entity->flags &= ~4; } return ApiStatus_DONE2; } ApiStatus AssignScript(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { Bytecode* toBind = (Bytecode*)evt_get_variable(script, *args++); get_entity_by_index(gLastCreatedEntityIndex)->boundScriptBytecode = toBind; return ApiStatus_DONE2; } return ApiStatus_DONE1; } ApiStatus AssignAreaFlag(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { s32 temp_s0 = evt_get_variable(script, *args++); Entity* entity = get_entity_by_index(gLastCreatedEntityIndex); // TODO find proper struct for the dataBuf ((s16*)(entity->dataBuf))[16] = temp_s0; if (get_area_flag(temp_s0) != 0) { entity->flags |= 0x20000000; } return ApiStatus_DONE2; } return ApiStatus_DONE1; } ApiStatus AssignBlockFlag(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { s32 temp_s0 = evt_get_variable_index(script, *args++); Entity* entity = get_entity_by_index(gLastCreatedEntityIndex); // TODO find proper struct for the dataBuf ((s16*)(entity->dataBuf))[5] = temp_s0; return ApiStatus_DONE2; } return ApiStatus_DONE1; } ApiStatus AssignFlag(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { Trigger* trigger = (Trigger*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf; trigger->flags.bytes.genericFlagIndex = evt_get_variable_index(script, *args); return ApiStatus_DONE2; } return ApiStatus_DONE1; } ApiStatus AssignPanelFlag(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { // TODO find proper struct for the dataBuf s16* dataBuf = (s16*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf; dataBuf[3] = evt_get_variable_index(script, *args++); return ApiStatus_DONE2; } return ApiStatus_DONE1; } ApiStatus AssignCrateFlag(Evt* script, s32 isInitialCall) { Bytecode* args = script->ptrReadPos; if (isInitialCall == TRUE) { // TODO find proper struct for the dataBuf s16* dataBuf = (s16*)get_entity_by_index(gLastCreatedEntityIndex)->dataBuf; dataBuf[2] = evt_get_variable_index(script, *args++); return ApiStatus_DONE2; } return ApiStatus_DONE1; } s32 create_entity_shadow(Entity* entity, f32 x, f32 y, f32 z) { u16 staticFlags = entity->staticData->flags; s32 type; s16 shadowIndex; if (staticFlags & 0x200) { if (staticFlags & 0x800) { type = 2; } else { type = 3; } } else { type = ((staticFlags >> 11) ^ 1) & 1; } shadowIndex = create_shadow_type(type, x, y, z); entity->shadowIndex = shadowIndex; get_shadow_by_index(shadowIndex)->flags |= 0xC00000; return entity->shadowIndex; } s32 create_shadow_type(s32 type, f32 x, f32 y, f32 z) { s32 setFlag200 = FALSE; StaticShadowData* data = &D_802E98BC; s32 shadowIndex; switch (type) { case 2: setFlag200 = TRUE; case 0: data = &D_802E98BC; break; case 3: setFlag200 = TRUE; case 1: data = &D_802E9904; break; case 5: setFlag200 = TRUE; case 4: data = &D_802E98E0; break; } shadowIndex = create_shadow_from_data(data, x, y, z); if (setFlag200) { get_shadow_by_index(shadowIndex)->flags |= 0x200; } return shadowIndex; } void delete_shadow(s32 shadowIndex) { _delete_shadow(shadowIndex); } void update_entity_shadow_position(Entity* entity) { Shadow* shadow = get_shadow_by_index(entity->shadowIndex); if (shadow != NULL) { f32 rayX; f32 rayY; f32 rayZ; f32 hitYaw; f32 hitPitch; f32 hitLength; f32 origHitLength; if (entity->alpha < 255) { shadow->unk_05 = entity->alpha / 2; } else { u8 alphaTemp; if (shadow->flags & 0x800000) { alphaTemp = 160; } else { alphaTemp = 128; } shadow->unk_05 = alphaTemp; } if (!(entity->flags & 4)) { if (shadow->flags & 0x400000) { shadow->flags &= ~0x400000; } else { return; } } rayX = entity->position.x; rayY = entity->position.y; rayZ = entity->position.z; if (!entity_raycast_down(&rayX, &rayY, &rayZ, &hitYaw, &hitPitch, &hitLength) && hitLength == 32767.0f) { hitLength = 0.0f; } origHitLength = hitLength; if (shadow->flags & 0x200) { hitLength = 212.5f; shadow->scale.x = entity->aabb.x / hitLength; shadow->scale.z = entity->aabb.z / hitLength; } else { hitLength = ((hitLength / 150.0f) + 0.95) * 250.0; shadow->scale.x = (entity->aabb.x / hitLength) * entity->scale.x; shadow->scale.z = (entity->aabb.z / hitLength) * entity->scale.z; } shadow->position.x = entity->position.x; shadow->position.z = entity->position.z; shadow->position.y = rayY; entity->shadowPosY = rayY; shadow->rotation.x = hitYaw; shadow->rotation.z = hitPitch; shadow->rotation.y = entity->rotation.y; if (entity->position.y < rayY) { shadow->flags |= 0x40000000; entity->position.y = rayY + 10.0f; } else { shadow->flags &= ~0x40000000; } shadow->flags = (shadow->flags & ~1) | ((u16)entity->flags & 1); if (!(entity->flags & 0x400) && origHitLength == 0.0f) { shadow->flags |= 1; } } else { entity->shadowPosY = 0.0f; } } s32 entity_raycast_down(f32* x, f32* y, f32* z, f32* hitYaw, f32* hitPitch, f32* hitLength) { f32 hitX, hitY, hitZ; f32 hitDepth; f32 hitNx, hitNy, hitNz; s32 entityID; s32 colliderID; s32 hitID; s32 ret; hitDepth = 32767.0f; *hitLength = 32767.0f; entityID = test_ray_entities(*x, *y, *z, 0.0f, -1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz); hitID = -1; ret = FALSE; if ((entityID >= 0) && ((get_entity_type(entityID) != 0xC) || (hitNx == 0.0f && hitNz == 0.0f && hitNy == 1.0))) { hitID = entityID | 0x4000; } colliderID = test_ray_colliders(0x10000, *x, *y, *z, 0.0f, -1.0f, 0.0f, &hitX, &hitY, &hitZ, &hitDepth, &hitNx, &hitNy, &hitNz); if (colliderID >= 0) { hitID = colliderID; } if (hitID >= 0) { *hitLength = hitDepth; *y = hitY; *hitYaw = -atan2(0.0f, 0.0f, hitNz * 100.0f, hitNy * 100.0f); *hitPitch = -atan2(0.0f, 0.0f, hitNx * 100.0f, hitNy * 100.0f); ret = TRUE; } else { *hitYaw = 0.0f; *hitPitch = 0.0f; } return ret; } void set_standard_shadow_scale(Shadow* shadow, f32 height) { if (!gGameStatusPtr->isBattle) { shadow->scale.x = 0.13 - (height / 2600.0f); } else { shadow->scale.x = 0.12 - (height / 3600.0f); } if (shadow->scale.x < 0.01) { shadow->scale.x = 0.01f; } shadow->scale.z = shadow->scale.x; } void set_npc_shadow_scale(Shadow* shadow, f32 height, f32 npcRadius) { if (!gGameStatusPtr->isBattle) { shadow->scale.x = 0.13 - (height / 2600.0f); } else { shadow->scale.x = 0.12 - (height / 3600.0f); } if (shadow->scale.x < 0.01) { shadow->scale.x = 0.01f; } if (npcRadius > 60.0f) { shadow->scale.z = shadow->scale.x * 2.0f; } else { shadow->scale.z = shadow->scale.x; } } void set_peach_shadow_scale(Shadow* shadow, f32 scale) { PlayerStatus* playerStatus = &gPlayerStatus; f32 phi_f2 = 0.12f; if (!gGameStatusPtr->isBattle) { switch (playerStatus->anim) { case 0xC0018: case 0xC0019: case 0xC001A: case 0xD0008: shadow->scale.x = 0.26f - (scale / 2600.0f); if (shadow->scale.x < 0.01) { shadow->scale.x = 0.01f; } shadow->scale.z = 0.13f - (scale / 2600.0f); if (shadow->scale.z < 0.01) { shadow->scale.z = 0.01f; } return; } phi_f2 = 0.16f; } shadow->scale.x = phi_f2 - (scale / 3600.0f); if (shadow->scale.x < 0.01) { shadow->scale.x = 0.01f; } shadow->scale.z = shadow->scale.x; } s32 is_block_on_ground(Entity* block) { f32 x = block->position.x; f32 y = block->position.y; f32 z = block->position.z; f32 hitYaw; f32 hitPitch; f32 hitLength; s32 ret; entity_raycast_down(&x, &y, &z, &hitYaw, &hitPitch, &hitLength); ret = hitLength; if (ret == 32767) { ret = 0; } return ret; } void state_delegate_NOP(void) { } // Dumb temp and weird i decrement and temp increment stuff needed to match void clear_game_modes(void) { GameMode* state = &gMainGameState[0]; s32 i; for (i = ARRAY_COUNT(gMainGameState) - 1; i >= 0; i--, state++) { state->flags = 0; } } // weird ordering at the beginning #ifndef NON_MATCHING INCLUDE_ASM(s32, "a5dd0_len_114e0", set_next_game_mode); #else GameMode* set_next_game_mode(GameMode* arg0) { GameMode* gameMode; s32 i; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++) { gameMode = &gMainGameState[i]; if (gameMode->flags == 0) { break; } } ASSERT(i < ARRAY_COUNT(gMainGameState)); gameMode->flags = 1 | 2; gameMode->init = arg0->init; gameMode->step = arg0->step; gameMode->render = arg0->render; gameMode->unk_0C = NULL; if (gameMode->init == NULL) { gameMode->init = state_delegate_NOP; } if (gameMode->step == NULL) { gameMode->step = state_delegate_NOP; } if (gameMode->unk_0C == NULL) { gameMode->unk_0C = state_delegate_NOP; } if (gameMode->render == NULL) { gameMode->render = state_delegate_NOP; } gameMode->renderAux = state_delegate_NOP; gameMode->init(); return gameMode; } #endif GameMode* set_game_mode_slot(s32 i, GameMode* arg0) { GameMode* gameMode = &gMainGameState[i]; ASSERT(i < ARRAY_COUNT(gMainGameState)); gameMode->flags = 1 | 2; gameMode->init = arg0->init; gameMode->step = arg0->step; gameMode->render = arg0->render; gameMode->unk_0C = NULL; if (gameMode->init == NULL) gameMode->init = state_delegate_NOP; if (gameMode->step == NULL) gameMode->step = state_delegate_NOP; if (gameMode->unk_0C == NULL) gameMode->unk_0C = state_delegate_NOP; if (gameMode->render == NULL) gameMode->render = state_delegate_NOP; gameMode->renderAux = state_delegate_NOP; gameMode->init(); return gameMode; } void game_mode_set_fpDrawAuxUI(s32 i, void (*fn)(void)) { GameMode* gameMode = &gMainGameState[i]; ASSERT(i < ARRAY_COUNT(gMainGameState)); gameMode->renderAux = fn; gameMode->flags |= 0x20; if (fn == NULL) { gameMode->renderAux = state_delegate_NOP; } } void func_80112DD4(s32 i) { gMainGameState[i].flags |= 4; } void func_80112DFC(s32 i) { gMainGameState[i].flags |= 8; } void func_80112E24(s32 i) { gMainGameState[i].flags &= ~0x1C; } void func_80112E4C(s32 i) { gMainGameState[i].flags &= ~0x0C; gMainGameState[i].flags |= 0x10; } void step_current_game_mode(void) { GameMode* gameMode = gMainGameState; s32 i; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) { if (gameMode->flags != 0) { if (!(gameMode->flags & 4)) { if (!(gameMode->flags & 8)) { gameMode->flags &= ~2; gameMode->step(); } } } } } void state_do_unk(void) { GameMode* gameMode = gMainGameState; s32 i; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) { if (gameMode->flags != 0) { if (!(gameMode->flags & 4)) { if (!(gameMode->flags & 0x10)) { gameMode->unk_0C(); } } } } } void state_render_backUI(void) { GameMode* gameMode = gMainGameState; s32 i; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) { if (gameMode->flags != 0) { if (!(gameMode->flags & 4)) { if (!(gameMode->flags & 0x10)) { gameMode->render(); } } } } } void state_render_frontUI(void) { GameMode* gameMode = gMainGameState; s32 i; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) { if (gameMode->flags != 0) { if (!(gameMode->flags & 4)) { if (!(gameMode->flags & 2)) { if (gameMode->flags & 0x20) { gameMode->renderAux(); } } } } } // re-initialization needed - evidence of inlining? or just copy/pasting? gameMode = &gMainGameState; for (i = 0; i < ARRAY_COUNT(gMainGameState); i++, gameMode++) { if (gameMode->flags != 0) { if (!(gameMode->flags & 4)) { if (!(gameMode->flags & 2)) { if (gameMode->flags & 0x10) { gameMode->render(); } } } } } } void appendGfx_model(Model* model); INCLUDE_ASM(void, "a5dd0_len_114e0", appendGfx_model, Model*); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80114B58); void load_tile_header(char* textureName, s32 romOffset, s32 size); INCLUDE_ASM(s32, "a5dd0_len_114e0", load_tile_header); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80115498); // Goofy temps needed to match ModelNodeProperty* get_model_property(ModelNode* node, ModelPropertyKeys key) { s32 numProperties = node->numProperties; ModelNodeProperty* propertyList = node->propertyList; s32 i; for (i = 0; i < numProperties; i++, propertyList++) { if (propertyList->key == key) { return propertyList; } } return NULL; } INCLUDE_ASM(s32, "a5dd0_len_114e0", _load_model_textures); void load_model_textures(ModelNode* model, s32 romOffset, s32 size) { s32 battleOffset = ((gGameStatusPtr->isBattle != 0) << 17); mdl_nextTextureAddress = mdl_textureBaseAddress + battleOffset; if (model != NULL && romOffset != 0 && size != 0) { s32 i; for (i = 0; i < ARRAY_COUNT(mdl_textureHandles); i++) { mdl_textureHandles[i].gfx = NULL; } mdl_treeIterPos = 0; if (model != NULL) { _load_model_textures(); } } } s32 mdl_get_child_count(ModelNode* model) { s32 ret = 0; if (model->type != 2 && model->groupData != NULL) { s32 numChildren = model->groupData->numChildren; if (numChildren != 0) { s32 i; ret += numChildren; for (i = 0; i < numChildren; i++) { ret += mdl_get_child_count(model->groupData->childList[i]); } } } return ret; } void clear_model_data(void) { s32 i; if (!gGameStatusPtr->isBattle) { gCurrentModels = &wModelList; gCurrentTransformGroups = &wTransformGroups; gCurrentCustomModelGfxPtr = &wModelSpecialDls; gCurrentCustomModelGfxBuildersPtr = &wCustomModelGfxBuilders; gCurrentModelTreeRoot = &D_80152214; gCurrentModelLocalVtxBuffers = &D_80152190; mdl_currentModelTreeNodeInfo = &D_80152220; D_801512F0 = &wBgRenderType; mdl_bgMultiplyColorA = 0; mdl_bgMultiplyColorR = 0; mdl_bgMultiplyColorG = 0; mdl_bgMultiplyColorB = 0; gCurrentFogSettings = &wFogSettings; } else { gCurrentModels = &bModelList; gCurrentTransformGroups = &bTransformGroups; gCurrentCustomModelGfxPtr = &bModelSpecialDls; gCurrentCustomModelGfxBuildersPtr = &bCustomModelGfxBuilders; gCurrentModelTreeRoot = &D_80152218; gCurrentModelLocalVtxBuffers = &D_801521D0; mdl_currentModelTreeNodeInfo = &D_80152A20; D_801512F0 = &bBgRenderType; gCurrentFogSettings = &bFogSettings; } for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) { (*gCurrentModels)[i] = 0; } for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) { (*gCurrentTransformGroups)[i] = 0; } for (i = 0; i < ARRAY_COUNT(*gCurrentCustomModelGfxPtr); i++) { (*gCurrentCustomModelGfxPtr)[i] = 0; (*gCurrentCustomModelGfxBuildersPtr)[i] = 0; } *gCurrentModelTreeRoot = NULL; for (i = 0; i < ARRAY_COUNT(*mdl_currentModelTreeNodeInfo); i++) { (*mdl_currentModelTreeNodeInfo)[i].modelIndex = -1; (*mdl_currentModelTreeNodeInfo)[i].treeDepth = 0; (*mdl_currentModelTreeNodeInfo)[i].textureID = 0; } *D_801512F0 = 0; gCurrentFogSettings->r = 10; gCurrentFogSettings->g = 10; gCurrentFogSettings->b = 10; gCurrentFogSettings->startDistance = 950; gCurrentFogSettings->enabled = FALSE; gCurrentFogSettings->a = 0; gCurrentFogSettings->endDistance = 1000; for (i = 0; i < ARRAY_COUNT(texPannerAuxV); i++) { texPannerAuxV[i] = 0; texPannerAuxU[i] = 0; texPannerMainV[i] = 0; texPannerMainU[i] = 0; } } void init_model_data(void) { if (!gGameStatusPtr->isBattle) { gCurrentModels = &wModelList; gCurrentTransformGroups = &wTransformGroups; gCurrentCustomModelGfxPtr = &wModelSpecialDls; gCurrentCustomModelGfxBuildersPtr = &wCustomModelGfxBuilders; gCurrentModelTreeRoot = &D_80152214; gCurrentModelLocalVtxBuffers = &D_80152190; mdl_currentModelTreeNodeInfo = &D_80152220; D_801512F0 = &wBgRenderType; gCurrentFogSettings = &wFogSettings; } else { gCurrentModels = &bModelList; gCurrentTransformGroups = &bTransformGroups; gCurrentCustomModelGfxPtr = &bModelSpecialDls; gCurrentCustomModelGfxBuildersPtr = &bCustomModelGfxBuilders; gCurrentModelTreeRoot = &D_80152218; gCurrentModelLocalVtxBuffers = &D_801521D0; mdl_currentModelTreeNodeInfo = &D_80152A20; D_801512F0 = &bBgRenderType; gCurrentFogSettings = &bFogSettings; } } void calculate_model_sizes(void) { s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) { Model* model = (*gCurrentModels)[i]; if (model != NULL) { ModelBoundingBox* bb = (ModelBoundingBox*)get_model_property(model->modelNode, MODEL_PROP_KEY_BOUNDING_BOX); bb->halfSizeX = (bb->maxX - bb->minX) * 0.5; bb->halfSizeY = (bb->maxY - bb->minY) * 0.5; bb->halfSizeZ = (bb->maxZ - bb->minZ) * 0.5; model->flags |= 0x1000; } } } void mdl_create_model(ModelBlueprint* bp, s32 arg1); INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_create_model); // The global here is getting optimized out because nothing is happening to it. Very weird #ifdef NON_MATCHING void func_80116674(void) { s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) { Model* m = (*gCurrentModels)[i]; } } #else INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80116674); #endif INCLUDE_ASM(s32, "a5dd0_len_114e0", func_80116698); INCLUDE_ASM(s32, "a5dd0_len_114e0", render_models); void appendGfx_model_group(Model* model); INCLUDE_ASM(void, "a5dd0_len_114e0", appendGfx_model_group, Model*); void func_80117D00(Model* model) { Model* mdl = model; // temps needed to match ModelNode* modelNode = mdl->modelNode; if (model->modelNode->type != SHAPE_TYPE_MODEL) { if (modelNode->groupData != NULL) { s32 numChildren = modelNode->groupData->numChildren; if (numChildren != 0) { s32 i; for (i = 0; i < numChildren; i++, mdl_treeIterPos++) { Model newModel = *mdl; ModelNodeProperty* prop; newModel.flags = mdl->flags; newModel.currentSpecialMatrix = mdl->currentSpecialMatrix; newModel.modelNode = modelNode->groupData->childList[i]; newModel.texPannerID = mdl->texPannerID; newModel.specialDisplayListID = mdl->specialDisplayListID; if (newModel.modelNode->type == SHAPE_TYPE_MODEL) { prop = get_model_property(newModel.modelNode, MODEL_PROP_KEY_RENDER_MODE); } else { prop = NULL; } if (prop != NULL) { newModel.renderMode = prop->data.s; } else { newModel.renderMode = 0; } newModel.textureID = (*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].textureID; newModel.unk_A9 = 0; func_80117D00(&newModel); } } } } else { appendGfx_model(mdl); } } // this looks like a switch, but I can't figure it out void render_transform_group_node(ModelNode* node) { Gfx** gfx = &gMasterGfxPos; Model* model; if (node != NULL) { if (node->type == SHAPE_TYPE_GROUP) { ModelNodeProperty* groupTypeProp = get_model_property(node, MODEL_PROP_KEY_GROUP_TYPE); if (groupTypeProp != NULL && groupTypeProp->data.s != 0) { model = get_model_from_list_index(mdl_currentTransformGroupChildIndex); if (!(model->flags & 2)) { appendGfx_model_group(model); } mdl_currentTransformGroupChildIndex++; return; } } if (node->type != SHAPE_TYPE_MODEL) { if (node->groupData != NULL) { s32 numChildren; s32 i; if (node->groupData->transformMatrix != NULL) { gSPMatrix((*gfx)++, node->groupData->transformMatrix, G_MTX_PUSH | G_MTX_MUL | G_MTX_MODELVIEW); } numChildren = node->groupData->numChildren; if (numChildren != 0) { for (i = 0; i < numChildren; i++) { render_transform_group_node(node->groupData->childList[i]); } } if (node->groupData->transformMatrix != NULL) { gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW); } } return; } model = get_model_from_list_index(mdl_currentTransformGroupChildIndex); if (!(model->flags & 2)) { appendGfx_model(model); } mdl_currentTransformGroupChildIndex++; } } // arg0 and gfx temps needed void render_transform_group(ModelTransformGroup* group) { ModelTransformGroup* mtg = group; Gfx** gfx = &gMasterGfxPos; if (!(mtg->flags & 4)) { mdl_currentTransformGroupChildIndex = mtg->minChildModelIndex; if (!(mtg->flags & 0x2000)) { gSPMatrix((*gfx)++, mtg->transformMtx, (G_MTX_PUSH | G_MTX_LOAD) | G_MTX_MODELVIEW); } render_transform_group_node(mtg->modelNode); if (!(mtg->flags & 0x2000)) { gSPPopMatrix((*gfx)++, G_MTX_MODELVIEW); } gDPPipeSync((*gfx)++); } } INCLUDE_ASM(s32, "a5dd0_len_114e0", func_801180E8); Model* get_model_from_list_index(s32 listIndex) { return (*gCurrentModels)[listIndex]; } void load_data_for_models(ModelNode* model, s32 romOffset, s32 size) { Matrix4f mtx; guMtxIdentF(mtx); if (romOffset != 0) { load_model_textures(model, romOffset, size); } *gCurrentModelTreeRoot = model; mdl_treeIterPos = 0; if (model != NULL) { load_model_transforms(model, NULL, mtx, 0); } } // tiny reg swap in the first loop #ifdef NON_MATCHING void load_model_transforms(ModelNode* model, ModelNode* parent, Matrix4f mdlTxMtx, s32 treeDepth) { Matrix4f sp10; Matrix4f sp50; ModelBlueprint modelBP; ModelBlueprint* modelBPptr = &modelBP; ModelNodeProperty* groupTypeProperty; s32 i; if (model->groupData != NULL && model->groupData->numChildren != 0) { s32 groupType; if (model->groupData->transformMatrix != NULL) { Matrix4f spA0; guMtxL2F(spA0, model->groupData->transformMatrix); guMtxCatF(spA0, mdlTxMtx, sp10); } groupTypeProperty = get_model_property(model, MODEL_PROP_KEY_GROUP_TYPE); if (groupTypeProperty == NULL) { groupType = 0; } else { groupType = groupTypeProperty->data.s; } if (model->type != 5 || groupType == 0) { for (i = 0; i < model->groupData->numChildren; i++) { ModelNode** modelTemp; Matrix4f* txMtx; modelTemp = &model->groupData->childList[i]; if (model->groupData->transformMatrix != NULL) { txMtx = sp10; } else { txMtx = mdlTxMtx; } load_model_transforms(*modelTemp, model, txMtx, treeDepth + 1); } (*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].modelIndex = -1; (*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].treeDepth = treeDepth; mdl_treeIterPos += 1; return; } } guMtxF2L(mdlTxMtx, sp50); modelBPptr->flags = 0; modelBPptr->mdlNode = model; modelBPptr->groupData = parent->groupData; modelBPptr->mtx = sp50; if (model->type == 5) { s32 childCount = mdl_get_child_count(model); for (i = mdl_treeIterPos; i < mdl_treeIterPos + childCount; i++) { (*mdl_currentModelTreeNodeInfo)[i].modelIndex = -1; (*mdl_currentModelTreeNodeInfo)[i].treeDepth = treeDepth + 1; } mdl_treeIterPos += childCount; } mdl_create_model(modelBPptr, 4); (*mdl_currentModelTreeNodeInfo)[mdl_treeIterPos].treeDepth = treeDepth; mdl_treeIterPos += 1; } #else INCLUDE_ASM(s32, "a5dd0_len_114e0", load_model_transforms); #endif s32 get_model_list_index_from_tree_index(s32 treeIndex) { s32 i; if (treeIndex < 0x100) { u8 modelIndex = (*mdl_currentModelTreeNodeInfo)[treeIndex].modelIndex; if (modelIndex != (u8)-1) { return modelIndex; } } for (i = 0; i < 0x100; i++) { Model* model = get_model_from_list_index(i); if (model != NULL && model->modelID == treeIndex) { return i; } } return 0; } s32 get_transform_group_index(s32 modelID) { ModelTransformGroup* group; s32 i; for (i = 0; i < MAX_MODEL_TRANSFORM_GROUPS; i++) { group = get_transform_group(i); if (group != NULL && group->groupModelID == modelID) { return i; } } return -1; } // TODO this seems to be returning center for the model and center for the BB (not the size) void get_model_center_and_size(u16 modelID, f32* centerX, f32* centerY, f32* centerZ, f32* sizeX, f32* sizeY, f32* sizeZ) { Model* model = get_model_from_list_index(get_model_list_index_from_tree_index(modelID)); ModelNode* node = model->modelNode; ModelBoundingBox* bb; *centerX = model->center.x; *centerY = model->center.y; *centerZ = model->center.z; bb = (ModelBoundingBox*)get_model_property(node, MODEL_PROP_KEY_BOUNDING_BOX); if (bb != NULL) { *sizeX = bb->halfSizeX; *sizeY = bb->halfSizeY; *sizeZ = bb->halfSizeZ; } else { *sizeX = *sizeY = *sizeZ = 0.0f; } } ModelTransformGroup* get_transform_group(s32 index) { return (*gCurrentTransformGroups)[index]; } INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011B1D8); void make_transform_group(u16 modelID) { mdl_treeIterPos = 0; D_80153370 = NULL; D_8015336E = modelID; D_80153376 = 0; D_80153374 = 0; func_8011B1D8(*gCurrentModelTreeRoot); if (D_80153370 != 0) { ModelTransformGroup* newMtg; ModelNode* node; ModelNodeProperty* prop; ModelBoundingBox* bb; f32 x, y, z; s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) { if ((*gCurrentTransformGroups)[i] == NULL) { break; } } (*gCurrentTransformGroups)[i] = newMtg = heap_malloc(sizeof(ModelTransformGroup)); newMtg->flags = 1; newMtg->groupModelID = modelID; newMtg->minChildModelIndex = get_model_list_index_from_tree_index(D_80153374); newMtg->maxChildModelIndex = get_model_list_index_from_tree_index(D_80153376); newMtg->matrixMode = 0; newMtg->matrixRDP_N = NULL; newMtg->modelNode = D_80153370; guMtxIdent(&newMtg->matrixA); newMtg->flags |= 0x2000; guMtxIdentF(newMtg->matrixB); node = newMtg->modelNode; if (node->type != SHAPE_TYPE_GROUP) { prop = get_model_property(node, MODEL_PROP_KEY_RENDER_MODE); } else { prop = get_model_property(node, MODEL_PROP_KEY_GROUP_TYPE); if (prop != NULL) { prop = &prop[1]; } } if (prop != NULL) { newMtg->renderMode = prop->data.s; } else { newMtg->renderMode = 1; } bb = (ModelBoundingBox*)get_model_property(node, MODEL_PROP_KEY_BOUNDING_BOX); if (bb != NULL) { x = (bb->minX + bb->maxX) * 0.5f; y = (bb->minY + bb->maxY) * 0.5f; z = (bb->minZ + bb->maxZ) * 0.5f; } else { x = y = z = 0.0f; } if (newMtg->matrixRDP_N != NULL) { guMtxXFML(newMtg->matrixRDP_N, x, y, z, &x, &y, &z); } newMtg->center.x = x; newMtg->center.y = y; newMtg->center.z = z; enable_transform_group(modelID); } } void enable_transform_group(u16 modelID) { ModelTransformGroup* group = get_transform_group(get_transform_group_index(modelID)); s32 i; group->flags &= ~0x4; for (i = group->minChildModelIndex; i <= group->maxChildModelIndex; i++) { Model* model = get_model_from_list_index(i); model->flags |= 0x8; if (model->currentMatrix != NULL) { model->flags |= 0x1000; } } } void disable_transform_group(u16 modelID) { ModelTransformGroup* group = get_transform_group(get_transform_group_index(modelID)); s32 i; group->flags |= 0x4; for (i = group->minChildModelIndex; i <= group->maxChildModelIndex; i++) { Model* model = get_model_from_list_index(i); model->flags &= ~0x8; if (model->currentMatrix != NULL) { model->flags |= 0x1000; } } } void clone_model(u16 srcModelID, u16 newModelID) { Model* srcModel = get_model_from_list_index(get_model_list_index_from_tree_index(srcModelID)); Model* newModel; s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) { if ((*gCurrentModels)[i] == NULL) { break; } } (*gCurrentModels)[i] = newModel = heap_malloc(sizeof(Model)); *newModel = *srcModel; newModel->modelID = newModelID; } INCLUDE_ASM(void, "a5dd0_len_114e0", func_8011B7C0, u16 arg0, s32 arg1, s32 arg2); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011B950); void func_8011BAE8(void) { s32 i; for (i = 0; i < ARRAY_COUNT(*gCurrentModels); i++) { Model* model = (*gCurrentModels)[i]; if (model != NULL) { model->flags &= ~0x0400; } } for (i = 0; i < ARRAY_COUNT(*gCurrentTransformGroups); i++) { ModelTransformGroup* transformGroup = (*gCurrentTransformGroups)[i]; if (transformGroup != NULL) { transformGroup->flags &= ~0x0400; } } } void enable_world_fog(void) { gCurrentFogSettings->enabled = TRUE; } void disable_world_fog(void) { gCurrentFogSettings->enabled = FALSE; } void set_world_fog_dist(s32 start, s32 end) { gCurrentFogSettings->startDistance = start; gCurrentFogSettings->endDistance = end; } void set_world_fog_color(s32 r, s32 g, s32 b, s32 a) { gCurrentFogSettings->r = r; gCurrentFogSettings->g = g; gCurrentFogSettings->b = b; gCurrentFogSettings->a = a; } s32 is_world_fog_enabled(void) { return gCurrentFogSettings->enabled; } void get_world_fog_distance(s32* start, s32* end) { *start = gCurrentFogSettings->startDistance; *end = gCurrentFogSettings->endDistance; } void get_world_fog_color(s32* r, s32* g, s32* b, s32* a) { *r = gCurrentFogSettings->r; *g = gCurrentFogSettings->g; *b = gCurrentFogSettings->b; *a = gCurrentFogSettings->a; } void set_tex_panner(Model* model, s8 texPannerID) { model->texPannerID = texPannerID; } void set_main_pan_u(s32 texPannerID, s32 value) { texPannerMainU[texPannerID] = value; } void set_main_pan_v(s32 texPannerID, s32 value) { texPannerMainV[texPannerID] = value; } void set_aux_pan_u(s32 texPannerID, s32 value) { texPannerAuxU[texPannerID] = value; } void set_aux_pan_v(s32 texPannerID, s32 value) { texPannerAuxV[texPannerID] = value; } void set_mdl_custom_gfx_set(Model* model, s32 customGfxIndex, u32 fogType) { if (customGfxIndex == -1) { customGfxIndex = model->specialDisplayListID & 15; } if (fogType == -1) { fogType = model->specialDisplayListID / 16; } model->specialDisplayListID = (customGfxIndex & 15) + ((fogType & 15) * 16); } void set_custom_gfx(s32 customGfxIndex, Gfx* pre, Gfx* post) { (*gCurrentCustomModelGfxPtr)[customGfxIndex * 2] = pre; (*gCurrentCustomModelGfxPtr)[customGfxIndex * 2 + 1] = post; } void set_custom_gfx_builders(s32 customGfxIndex, ModelCustomGfxBuilderFunc pre, ModelCustomGfxBuilderFunc post) { (*gCurrentCustomModelGfxBuildersPtr)[customGfxIndex * 2] = pre; (*gCurrentCustomModelGfxBuildersPtr)[customGfxIndex * 2 + 1] = post; } void build_custom_gfx(void) { Gfx* gfx = gMasterGfxPos; ModelCustomGfxBuilderFunc preFunc; ModelCustomGfxBuilderFunc postFunc; s32 i; gSPBranchList(gMasterGfxPos++, 0x00000000); for (i = 0; i < ARRAY_COUNT(*gCurrentCustomModelGfxPtr) / 2; i++) { preFunc = (*gCurrentCustomModelGfxBuildersPtr)[i * 2]; if (preFunc != NULL) { (*gCurrentCustomModelGfxPtr)[i * 2] = gMasterGfxPos; preFunc(i); gSPEndDisplayList(gMasterGfxPos++); } postFunc = (*gCurrentCustomModelGfxBuildersPtr)[i * 2 + 1]; if (postFunc != NULL) { (*gCurrentCustomModelGfxPtr)[i * 2 + 1] = gMasterGfxPos; postFunc(i); gSPEndDisplayList(gMasterGfxPos++); } } gSPBranchList(gfx, gMasterGfxPos); } // weird temps necessary to match /// @returns TRUE if mtx is NULL or identity. s32 is_identity_fixed_mtx(Matrix4s* mtx) { s32* mtxIt = (s32*)mtx; s32* identityIt; s32 i; if (mtx == NULL) { return TRUE; } identityIt = (s32*)&mdl_RDPIdentity; for (i = 0; i < 16; i++, mtxIt++, identityIt++) { if (*mtxIt != *identityIt) { return FALSE; } } return TRUE; } void set_background_color_blend(u8 r, u8 g, u8 b, u8 a) { mdl_bgMultiplyColorR = r; mdl_bgMultiplyColorG = g; mdl_bgMultiplyColorB = b; mdl_bgMultiplyColorA = a; } void get_background_color_blend(u8* r, u8* g, u8* b, u8* a) { *r = mdl_bgMultiplyColorR; *g = mdl_bgMultiplyColorG; *b = mdl_bgMultiplyColorB; *a = mdl_bgMultiplyColorA; } void set_model_fog_color_parameters(s8 primR, s8 primG, s8 primB, s8 primA, s32 fogR, s32 fogG, s32 fogB, s32 fogStart, s32 fogEnd) { mdl_renderModelFogPrimColorR = primR; mdl_renderModelFogPrimColorG = primG; mdl_renderModelFogPrimColorB = primB; mdl_renderModelFogPrimColorA = primA; mdl_renderModelFogColorR = fogR; mdl_renderModelFogColorG = fogG; mdl_renderModelFogColorB = fogB; mdl_renderModelFogStart = fogStart; mdl_renderModelFogEnd = fogEnd; } void get_model_fog_color_parameters(u8* primR, u8* primG, u8* primB, u8* primA, u8* fogR, u8* fogG, u8* fogB, s32* fogStart, s32* fogEnd) { *primR = mdl_renderModelFogPrimColorR; *primG = mdl_renderModelFogPrimColorG; *primB = mdl_renderModelFogPrimColorB; *primA = mdl_renderModelFogPrimColorA; *fogR = mdl_renderModelFogColorR; *fogG = mdl_renderModelFogColorG; *fogB = mdl_renderModelFogColorB; *fogStart = mdl_renderModelFogStart; *fogEnd = mdl_renderModelFogEnd; } void set_model_env_color_parameters(u8 primR, u8 primG, u8 primB, u8 envR, s32 envG, s32 envB) { gRenderModelPrimR = primR; gRenderModelPrimG = primG; gRenderModelPrimB = primB; gRenderModelEnvR = envR; gRenderModelEnvG = envG; gRenderModelEnvB = envB; } void get_model_env_color_parameters(u8* primR, u8* primG, u8* primB, u8* envR, u8* envG, u8* envB) { *primR = gRenderModelPrimR; *primG = gRenderModelPrimG; *primB = gRenderModelPrimB; *envR = gRenderModelEnvR; *envG = gRenderModelEnvG; *envB = gRenderModelEnvB; } INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_get_vertex_count); INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_local_gfx_update_vtx_pointers); INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_local_gfx_copy_vertices); INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_make_local_vertex_copy); void mdl_get_copied_vertices(s32 copyIndex, Vtx** firstVertex, Vtx** copiedVertices, s32* numCopied) { ModelLocalVertexCopy* mlvc = gCurrentModelLocalVtxBuffers[copyIndex]; s32 selector = mlvc->selector; *firstVertex = mlvc->minVertexAddr; *copiedVertices = mlvc->vtxCopy[selector]; *numCopied = mlvc->numVertices; } Gfx* mdl_get_copied_gfx(s32 copyIndex) { ModelLocalVertexCopy* mlvc = gCurrentModelLocalVtxBuffers[copyIndex]; s32 selector = mlvc->selector; Gfx* gfxCopy = mlvc->gfxCopy[selector]; mlvc->selector++; if (mlvc->selector >= 2) { mlvc->selector = 0; } return gfxCopy; } void mdl_project_tex_coords(s32 modelID, Gfx* destGfx, Matrix4f* destMtx, Vtx* destVertices); INCLUDE_ASM(s32, "a5dd0_len_114e0", mdl_project_tex_coords); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011C80C); INCLUDE_ASM(s32, "a5dd0_len_114e0", func_8011CFBC); void mdl_draw_hidden_panel_surface(Gfx** arg0, u16 treeIndex) { Model* model = get_model_from_list_index(get_model_list_index_from_tree_index(treeIndex)); Model copied = *model; Gfx* oldGfxPos; s32 flag; if (*arg0 == gMasterGfxPos) { flag = 1; } oldGfxPos = gMasterGfxPos; gMasterGfxPos = *arg0; copied.flags = 0x80 | 0x1; appendGfx_model(&copied); *arg0 = gMasterGfxPos; if (flag == 0) { gMasterGfxPos = oldGfxPos; } } s32 mdl_get_next_texture_address(s32 size) { u32 offset = mdl_nextTextureAddress - mdl_textureBaseAddress + 0x3F; offset = (offset >> 6) << 6; if (size + offset > 0x28000) { return 0; } else { return mdl_textureBaseAddress + offset; } } void mdl_set_all_fog_mode(s32 fogMode) { ModelList* modelList = gCurrentModels; Model* model; s32 fogType = fogMode; // weirdness here and the next line needed to match s32 i = fogMode; for (i = 0; i < ARRAY_COUNT(*modelList); i++) { model = (*modelList)[i]; if (model != NULL) { set_mdl_custom_gfx_set(model, -1, fogType); } } } void clear_render_tasks(void) { s32 i; for (i = 0; i < ARRAY_COUNT(mdl_clearRenderTasks); i++) { mdl_renderTaskLists[i] = mdl_clearRenderTasks[i]; } mdl_renderTaskMode = 0; mdl_renderTaskCount = 0; } void clear_render_tasks_alt(void) { s32 i; for (i = 0; i < ARRAY_COUNT(mdl_clearRenderTasks); i++) { mdl_renderTaskLists[i] = mdl_clearRenderTasks[i]; } mdl_renderTaskMode = 0; mdl_renderTaskCount = 0; } RenderTask* queue_render_task(RenderTask* task) { RenderTask* ret = mdl_renderTaskLists[mdl_renderTaskMode]; ASSERT(mdl_renderTaskCount < 0x100); ret = &ret[mdl_renderTaskCount++]; ret->renderMode = 1; if (task->renderMode == 0x2D) { ret->renderMode = 0x21; } ret->appendGfxArg = task->appendGfxArg; ret->appendGfx = task->appendGfx; ret->distance = D_8014C188[task->renderMode] - task->distance; return ret; } INCLUDE_ASM(s32, "a5dd0_len_114e0", execute_render_tasks);