From f05601f1032cedec84efacaa7672bc3e51364a1c Mon Sep 17 00:00:00 2001 From: bismurphy Date: Fri, 25 Oct 2024 18:56:41 -0400 Subject: [PATCH] Eliminate ET_Generic, and ext.stub (#1825) The quest is done! This eliminates the ET_Generic, and as a bonus, stub, from the Entity struct. This means no future code will be able to use these as defaults and will have to choose a particular extension, which is nice. As usual, while doing these cleanups I found various duplications to solve and file splits to normalize. Overall the code becomes more and more readable. --- config/splat.us.stdre.yaml | 10 +- config/splat.us.stmad.yaml | 4 + config/splat.us.stno3.yaml | 7 +- config/splat.us.stnp3.yaml | 7 +- config/symbols.stmad.txt | 2 + config/symbols.us.stdre.txt | 2 + config/symbols.us.stno3.txt | 3 +- include/entity.h | 54 ++++----- src/dra/8D3E8.c | 8 +- src/st/collision.h | 3 +- src/st/dre/11A64.c | 199 ------------------------------- src/st/dre/11E34.c | 87 ++++++++++++++ src/st/dre/161DC.c | 10 +- src/st/dre/dre.h | 3 +- src/st/dre/e_breakable.c | 12 ++ src/st/dre/st_debug.c | 31 +++++ src/st/e_bat.h | 77 ++++++++++++ src/st/entity_unk_id12.h | 26 ++-- src/st/entrance_stage_entities.h | 4 +- src/st/mad/D8C8.c | 97 --------------- src/st/mad/e_breakable.c | 5 + src/st/mad/st_debug.c | 25 ++++ src/st/no3/3E134.c | 4 +- src/st/no3/3FF00.c | 53 ++++---- src/st/no3/56264.c | 75 ------------ src/st/no3/e_bat.c | 4 + src/st/no3/e_init.c | 4 +- src/st/no3/no3.h | 4 +- src/st/np3/4997C.c | 74 ------------ src/st/np3/e_bat.c | 4 + src/st/np3/np3.h | 3 - src/st/nz0/311C0.c | 4 +- src/st/st0/27D64.c | 4 +- src/st/st0/2A218.c | 16 +-- src/st/st0/2B0C8.c | 4 +- src/st/st0/st0.h | 4 - src/st/unk_anim_func.h | 15 ++- src/weapon/w_015.c | 4 +- 38 files changed, 387 insertions(+), 565 deletions(-) delete mode 100644 src/st/dre/11A64.c create mode 100644 src/st/dre/11E34.c create mode 100644 src/st/dre/e_breakable.c create mode 100644 src/st/dre/st_debug.c create mode 100644 src/st/e_bat.h create mode 100644 src/st/mad/e_breakable.c create mode 100644 src/st/mad/st_debug.c delete mode 100644 src/st/no3/56264.c create mode 100644 src/st/no3/e_bat.c delete mode 100644 src/st/np3/4997C.c create mode 100644 src/st/np3/e_bat.c diff --git a/config/splat.us.stdre.yaml b/config/splat.us.stdre.yaml index 17c47457f..efb80937e 100644 --- a/config/splat.us.stdre.yaml +++ b/config/splat.us.stdre.yaml @@ -40,7 +40,7 @@ segments: - [0x128, data] - [0x220, .data, e_laydef] # layout entries header - [0x3C8, data] - - [0x590, data] + - [0x580, .data, st_debug] - [0x610, data] - [0x630, data] - [0x640, data] @@ -71,7 +71,7 @@ segments: - [0xB548, .data, tile_data] # tile data - [0xBD48, .data, tile_data] # tile definitions - [0x10168, .data, sprites] - - [0x1171C, .rodata, 11A64] + - [0x1171C, .rodata, 11E34] - [0x11728, .rodata, succubus] # EntitySuccubus - [0x11808, .rodata, cutscene] - [0x1181C, .rodata, cutscene] #D_80180938, names @@ -85,8 +85,10 @@ segments: - [0x11A14, .rodata, e_misc] - [0x11A28, .rodata, 20734] # EntityStageNamePopup - [0x11A5C, .rodata, prim_helpers] - - [0x11A64, c] - - [0x11A64, c, succubus] + - [0x11A64, c, st_debug] + - [0x11D00, c, e_breakable] + - [0x11E34, c] + - [0x12104, c, succubus] - [0x14774, c, cutscene] - [0x161DC, c] - [0x1697C, c] diff --git a/config/splat.us.stmad.yaml b/config/splat.us.stmad.yaml index 330a243cb..c08e8a2da 100644 --- a/config/splat.us.stmad.yaml +++ b/config/splat.us.stmad.yaml @@ -39,6 +39,8 @@ segments: subsegments: - [0x0, .data, header] - [0xB8, data] + - [0x5B4, .data, st_debug] + - [0x634, data] - [0x6B4, .data, st_update] - [0x6DC, .data, collision] - [0x9D4, .data, e_red_door] @@ -82,6 +84,8 @@ segments: - [0xD8AC, rodata] - [0xD8C0, .rodata, prim_helpers] - [0xD8C8, c] + - [0xE5AC, c, st_debug] + - [0xE830, c, e_breakable] - [0xE964, c, st_update] - [0xEDB8, c, collision] - [0x10544, c, create_entity] diff --git a/config/splat.us.stno3.yaml b/config/splat.us.stno3.yaml index b6a5dbba8..3ac206d9c 100644 --- a/config/splat.us.stno3.yaml +++ b/config/splat.us.stno3.yaml @@ -67,7 +67,8 @@ segments: - [0x3AF0, data] - [0x3B30, data] - [0x3B50, .data, e_bone_scimitar] - - [0x3C44, data] + - [0x3C44, .data, e_bat] + - [0x3C7C, data] - [0x3CC4, .data, rooms] - [0x3DC8, .data, e_layout] # layout entries data - [0x4CE0, .data, cutscene_data] @@ -104,7 +105,7 @@ segments: - [0x37738, .rodata, e_merman2] - [0x3775C, .rodata, 53F38] - [0x37784, .rodata, e_bone_scimitar] - - [0x377A4, .rodata, 56264] # EntityBat + - [0x377A4, .rodata, e_bat] # EntityBat - [0x377B8, .rodata, 564B0] # EntityZombie - [0x377CC, .rodata, prim_helpers] - [0x377D4, c] @@ -130,7 +131,7 @@ segments: - [0x516B4, c, e_merman2] - [0x53F38, c] - [0x559d0, c, e_bone_scimitar] - - [0x56264, c] + - [0x56264, c, e_bat] - [0x564B0, c] - [0x56880, c, prim_helpers] - [0x570B0, .bss, create_entity] diff --git a/config/splat.us.stnp3.yaml b/config/splat.us.stnp3.yaml index b59d59c24..da396c42f 100644 --- a/config/splat.us.stnp3.yaml +++ b/config/splat.us.stnp3.yaml @@ -58,7 +58,8 @@ segments: - [0x2400, data] - [0x2440, data] - [0x2460, .data, e_bone_scimitar] - - [0x2554, data] + - [0x2554, .data, e_bat] + - [0x258C, data] - [0x25D4, .data, e_bloody_zombie] - [0x26CC, data] - [0x2720, data] @@ -91,7 +92,7 @@ segments: - [0x32020, .rodata, e_merman2] # EntityMerman2 - [0x32044, .rodata, 48238] # EntityMerman - [0x3206C, .rodata, e_bone_scimitar] # EntityBoneScimitar data - - [0x3208C, .rodata, 4997C] # EntityBat + - [0x3208C, .rodata, e_bat] # EntityBat - [0x320A0, .rodata, 49BC8] # EntityZombie - [0x320B4, .rodata, e_bloody_zombie] # EntityBloodyZombie data - [0x320DC, .rodata, 4B018] # Shared charal string for owl and owl knight @@ -126,7 +127,7 @@ segments: - [0x44DCC, c, e_merman2] # Merman Entities - [0x48238, c] # Merman Entities (2) - [0x490E8, c, e_bone_scimitar] # EntityBoneScimitar - - [0x4997C, c] + - [0x4997C, c, e_bat] - [0x49BC8, c] - [0x49F98, c, e_bloody_zombie] # EntityBloodyZombie - [0x4B018, c] diff --git a/config/symbols.stmad.txt b/config/symbols.stmad.txt index 0fca8e436..de72f6551 100644 --- a/config/symbols.stmad.txt +++ b/config/symbols.stmad.txt @@ -5,6 +5,7 @@ MAD_pStObjLayoutVertical = 0x801803C8; MAD_EntityUpdates = 0x8018049C; g_EInitBreakable = 0x801804F0; g_EInitUnkId13 = 0x8018052C; +g_EInitUnkId12 = 0x80180538; g_EInitCommon = 0x80180544; g_EInitDamageNum = 0x80180550; g_eBreakableAnimations = 0x80180644; @@ -36,6 +37,7 @@ g_pStrObjLayout18 = 0x80181AF8; g_pStrObjLayout19 = 0x80181BA2; g_pStrObjLayout20 = 0x80181C4C; g_pStrObjLayout21 = 0x80181CF6; +EntityUnkId12 = 0x8018E674; EntityBreakable = 0x8018E830; EntityDamageDisplay = 0x8018FEA0; EntityRedDoor = 0x80191120; diff --git a/config/symbols.us.stdre.txt b/config/symbols.us.stdre.txt index a7a10c612..6c42fe6aa 100644 --- a/config/symbols.us.stdre.txt +++ b/config/symbols.us.stdre.txt @@ -5,6 +5,7 @@ g_EInitObtainable = 0x80180464; g_EInitParticle = 0x80180470; g_EInitInteractable = 0x80180488; g_EInitUnkId13 = 0x80180494; +g_EInitUnkId12 = 0x801804A0; g_EInitCommon = 0x801804AC; g_EInitDamageNum = 0x801804B8; DRE_RedDoorTiles = 0x80180550; @@ -19,6 +20,7 @@ g_ESoulStealOrbAngles = 0x8018138C; g_ESoulStealOrbSprt = 0x8018139C; g_ESoulStealOrbAnim = 0x801813FC; EntityUnkId11 = 0x80191A64; +EntityUnkId12 = 0x80191B44; EntityBreakable = 0x80191D00; EntityBackgroundClouds = 0x80191E34; EntitySuccubus = 0x80192104; diff --git a/config/symbols.us.stno3.txt b/config/symbols.us.stno3.txt index bf5e49e6f..35b4ab71d 100644 --- a/config/symbols.us.stno3.txt +++ b/config/symbols.us.stno3.txt @@ -13,6 +13,7 @@ g_EInitWaterObject = 0x80180B48; g_EInitWaterSplash = 0x80180B54; g_EInitBoneScimitar = 0x80180B78; g_EInitScimitarParts = 0x80180B84; +g_EInitBat = 0x80180B90; NO3_RedDoorTiles = 0x80180DA0; g_eBreakableAnimations = 0x80180E50; g_eBreakableHitboxes = 0x80180E70; @@ -102,7 +103,7 @@ NO3_EntityCutscene = 0x801BEEB0; EntityRoomTransition2 = 0x801BFF00; EntityDeathStolenItem = 0x801C033C; EntityDeath = 0x801C083C; -EntityUnkId5B = 0x801C11A4; +EntityDeathScythe = 0x801C11A4; EntityDeathScytheShadow = 0x801C12E8; CreateExplosionPuff = 0x801C13F8; Random = 0x801C184C; diff --git a/include/entity.h b/include/entity.h index 92368c766..44d05b075 100644 --- a/include/entity.h +++ b/include/entity.h @@ -4,22 +4,15 @@ struct Entity; typedef void (*PfnEntityUpdate)(struct Entity*); +// Placeholders for M2C to use. No code should be merged which uses them. typedef union { - s16 s; - u16 u; - struct { - s8 unk0, unk1; - } S8; - struct { - u8 unk0, unk1; - } U8; -} Multi16; - -struct Entity; - -typedef struct ET_Generic { - /* 0x7C */ Multi16 unk7C; // posX -} ET_Generic; + u8 u8[0x3C]; + s8 s8[0x3C]; + u16 u16[0x1E]; + s16 s16[0x1E]; + u32 u32[0xF]; + s32 s32[0xF]; +} ET_Placeholder; typedef struct { /* 0x7C */ u16 timer; @@ -851,7 +844,7 @@ typedef struct { } ET_EntitySlot16; typedef struct { - /* 0x7C */ s16 unk7C; + /* 0x7C */ u16 unk7C; } ET_Entity12; typedef struct { @@ -865,6 +858,11 @@ typedef struct { s16 t; } ET_TimerOnly; +// silly unsigned alternative needed in ST0 EntityCutscene +typedef struct { + u16 t; +} ET_UTimerOnly; + typedef struct { /* 0x7C */ s8 unk7C; /* 0x7D */ s8 unk7D; @@ -1486,13 +1484,6 @@ typedef struct { s16 unk84; } ET_DracFinal; -// To be used for EntityEquipItemDrop and/or EntityPrizeDrop, when they are -// moved off of Generic. -typedef struct { - byte pad[0x18]; - s32 unk94; -} ET_Drop; - typedef struct { /* 0x7C */ byte pad[4]; /* 0x80 */ s16 angle; @@ -1841,11 +1832,12 @@ typedef struct { } ET_Warg; typedef struct { - /* 0x7C */ s32 : 32; + /* 0x7C */ u16 extStep; /* 0x80 */ s32 : 32; /* 0x84 */ u16 timer; } ET_DeathScythe; +// A couple entities in MAD and ST0 which exist, but are not referenced typedef struct { /* 0x7C */ u8 animframe; /* 0x7D */ s32 : 24; @@ -1901,16 +1893,24 @@ typedef struct { s16 boolDidSound; } ET_RicMaria; +// This is the Bat enemy, seen in the Entrance and elsewhere. +// ET_Bat is already taken by the familiar. Perhaps that should be +// ET_BatFam and this be ET_Bat? Seems familiars should all be labeled since +// there are fewer of those than there are enemies. +typedef struct { + s32 accelY; +} ET_BatEnemy; + // ====== RIC ENTITIES ====== // ========================== typedef union { // offset=0x7C struct Primitive* prim; - char stub[0x3C]; + ET_Placeholder ILLEGAL; ET_TimerOnly timer; + ET_UTimerOnly utimer; ET_EntFactory factory; - ET_Generic generic; ET_EntitySlot1 entSlot1; // g_Entities[1], not entityID 1 ET_EntitySlot16 entSlot16; ET_Entity12 ent12; // entityID 12 @@ -2021,7 +2021,6 @@ typedef union { // offset=0x7C ET_SpittleBone spittleBone; ET_Player player; ET_801AF774 et_801AF774; - ET_Drop drop; ET_BigRedFireball bigredfireball; ET_SummonSpirit summonspirit; ET_3DBackgroundhouse bghouse; @@ -2068,6 +2067,7 @@ typedef union { // offset=0x7C ET_ExpandingCircle circleExpand; ET_RicMariaPower ricMariaPower; ET_RicMaria ricMaria; + ET_BatEnemy batEnemy; } Ext; #define SYNC_FIELD(struct1, struct2, field) \ diff --git a/src/dra/8D3E8.c b/src/dra/8D3E8.c index 10ac0d820..942055387 100644 --- a/src/dra/8D3E8.c +++ b/src/dra/8D3E8.c @@ -2051,19 +2051,19 @@ void EntityGiantSpinningCross(Entity* self) { func_8011A290(self); self->hitboxHeight = 0x50; self->hitboxWidth = 0xC; + self->facingLeft = 0; self->posY.i.hi = 0x160; self->velocityY = FIX(-6); self->flags = FLAG_KEEP_ALIVE_OFFCAMERA | FLAG_HAS_PRIMS; - self->facingLeft = 0; self->ext.giantcross.unk7C = 0; self->ext.giantcross.unk7E = 0x400; PlaySfx(SFX_FIREBALL_SHOT_B); self->step++; - primUVCoords = &D_800B0F94[0][0]; prim = &g_PrimBuf[self->primIndex]; + primUVCoords = &D_800B0F94[0][0]; for (i = 0; i < LEN(D_800B0CB4); i++, prim = prim->next, primUVCoords += 5) { - prim->clut = (primUVCoords[4] & 0xF) | 0x1A0; + prim->clut = (primUVCoords[4] & 0xF) + 0x1A0; switch (primUVCoords[4] & 0xF0) { case 0x10: prim->u0 = primUVCoords[0] + primUVCoords[2]; @@ -2175,7 +2175,7 @@ void EntityGiantSpinningCross(Entity* self) { gte_ldv0(&pos); gte_rtps(); prim = &g_PrimBuf[self->primIndex]; - vectors_ptr = &D_800B0CB4; + vectors_ptr = (SVECTOR**)&D_800B0CB4; gte_stsxy2(&prim->x0); gte_stszotz(&z); self->hitboxOffX = prim->x0 - self->posX.i.hi; diff --git a/src/st/collision.h b/src/st/collision.h index fb355836c..11ee002d2 100644 --- a/src/st/collision.h +++ b/src/st/collision.h @@ -584,7 +584,8 @@ void HitDetection(void) { CreateEntityFromEntity( 3, iterEnt1, otherEntity); } - otherEntity->ext.drop.unk94 = miscVar1; + otherEntity->ext.equipItemDrop.castleFlag = + miscVar1; otherEntity->params = miscVar3; // item pops up in the air a bit when spawned otherEntity->velocityY = FIX(-3.5); diff --git a/src/st/dre/11A64.c b/src/st/dre/11A64.c deleted file mode 100644 index c7c000c60..000000000 --- a/src/st/dre/11A64.c +++ /dev/null @@ -1,199 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -#include "dre.h" -#include "sfx.h" - -// puts garbled hp max up text on screen -void EntityUnkId11(Entity* entity) { - ObjInit* obj = (ObjInit*)&D_80180528[entity->params * 10]; - - if (entity->step == 0) { - InitializeEntity(g_EInitCommon); - entity->animSet = obj->animSet; - entity->zPriority = obj->zPriority; - entity->unk5A = obj->unk5A; - entity->palette = obj->palette; - entity->drawFlags = obj->drawFlags; - entity->drawMode = obj->drawMode; - - if (obj->unkC != 0) { - entity->flags = obj->unkC; - } - - if (entity->params == 1) { - entity->rotY = 0x200; - entity->rotX = 0x200; - } - } - - AnimateEntity(obj->animFrames, entity); -} - -void func_80191B44(Entity* entity) { - s32 ret; - u16* temp_v0_2; - u16 temp_s1 = entity->params; - u16 phi_v1; - u16 unk; - entity->unk6D[0] = 0; - - if (entity->step != 0) { - switch (temp_s1) { - case 4: - case 5: - if (g_Tilemap.x != 0) { - return; - } - break; - - case 6: - if (g_pads->pressed & PAD_TRIANGLE) { - g_Tilemap.x = 0; - g_Tilemap.width = 1280; - entity->step++; - return; - } - break; - } - - if (entity->hitParams) { - ret = GetSideToPlayer(); - phi_v1 = entity->ext.generic.unk7C.s; - if (phi_v1 != 0) { - phi_v1 = (ret & 2) * 2; - } else { - phi_v1 = (ret & 1) * 4; - } - unk = 8; - temp_s1 = (temp_s1 * unk) + phi_v1; - temp_v0_2 = &D_80180590[temp_s1]; - g_Tilemap.x = *(temp_v0_2++); - g_Tilemap.y = *(temp_v0_2++); - g_Tilemap.width = *(temp_v0_2++); - g_Tilemap.height = *(temp_v0_2++); - } - } else { - InitializeEntity(D_801804A0); - entity->ext.generic.unk7C.s = D_80180588[temp_s1]; - if (entity->ext.generic.unk7C.s != 0) { - entity->hitboxWidth = D_80180580[temp_s1]; - entity->hitboxHeight = 16; - } else { - entity->hitboxWidth = 16; - entity->hitboxHeight = D_80180580[temp_s1]; - } - } -} - -extern u16 g_EInitBreakable[]; -extern u8* g_eBreakableAnimations[]; -extern u8 g_eBreakableHitboxes[]; -extern u8 g_eBreakableExplosionTypes[]; -extern u16 g_eBreakableanimSets[]; -extern u8 g_eBreakableDrawModes[]; -void EntityBreakable(Entity* entity) { - Entity* temp_v0; - u16 temp_s0 = entity->params >> 0xC; - - if (entity->step != 0) { - AnimateEntity(g_eBreakableAnimations[temp_s0], entity); - if (entity->hitParams) { - g_api.PlaySfx(SFX_CANDLE_HIT); - temp_v0 = AllocEntity(&g_Entities[224], &g_Entities[256]); - if (temp_v0 != NULL) { - CreateEntityFromCurrentEntity(E_EXPLOSION, temp_v0); - temp_v0->params = g_eBreakableExplosionTypes[temp_s0]; - } - ReplaceBreakableWithItemDrop(entity); - } - } else { - InitializeEntity(g_EInitBreakable); - entity->zPriority = g_unkGraphicsStruct.g_zEntityCenter - 20; - entity->drawMode = g_eBreakableDrawModes[temp_s0]; - entity->hitboxHeight = g_eBreakableHitboxes[temp_s0]; - entity->animSet = g_eBreakableanimSets[temp_s0]; - } -} - -// clouds in the background ID 0x18 -void EntityBackgroundClouds(Entity* self) { - Primitive* prim; - s16 primIndex; - s32 camX, camY; - - switch (self->step) { - case 0: - InitializeEntity(g_EInitInteractable); - primIndex = g_api.AllocPrimitives(PRIM_GT4, 5); - if (primIndex == -1) { - DestroyEntity(self); - return; - } - prim = &g_PrimBuf[primIndex]; - self->primIndex = primIndex; - self->ext.prim = prim; - self->flags |= FLAG_HAS_PRIMS; - prim->type = PRIM_G4; - prim->x0 = prim->x2 = 0; - prim->x1 = prim->x3 = 0x100; - prim->y0 = prim->y1 = 0x6E - g_Tilemap.scrollY.i.hi; - prim->y2 = prim->y3 = 0xF0; - setRGB0(prim, 16, 16, 16); - prim->priority = 0x20; - prim->drawMode = DRAW_DEFAULT; - LOW(prim->r1) = LOW(prim->r0); - LOW(prim->r2) = LOW(prim->r0); - LOW(prim->r3) = LOW(prim->r0); - prim = prim->next; - camX = -g_Tilemap.scrollX.i.hi; - camY = 32 - g_Tilemap.scrollY.i.hi; - while (prim != 0) { - prim->x0 = prim->x2 = camX; - camX += 95; - prim->x1 = prim->x3 = camX; - prim->tpage = 0xF; - prim->clut = 5; - prim->u0 = prim->u2 = 0x84; - prim->u1 = prim->u3 = 0xE3; - prim->v0 = prim->v1 = 1; - prim->v2 = prim->v3 = 0x4F; - prim->y0 = prim->y1 = camY; - prim->y2 = prim->y3 = camY + 0x4E; - prim->priority = 0x20; - prim->drawMode = DRAW_DEFAULT; - prim = prim->next; - } - break; - - case 255: - /** - * Debug: Press SQUARE / CIRCLE on the second controller - * to advance/rewind current animation frame - */ - FntPrint("charal %x\n", self->animCurFrame); - if (g_pads[1].pressed & PAD_SQUARE) { - if (self->params == 0) { - self->animCurFrame++; - self->params |= 1; - } else { - break; - } - } else { - self->params = 0; - } - if (g_pads[1].pressed & PAD_CIRCLE) { - if (self->step_s == 0) { - self->animCurFrame--; - self->step_s |= 1; - } - } else { - self->step_s = 0; - } - break; - } - g_GpuBuffers[0].draw.r0 = 40; - g_GpuBuffers[0].draw.g0 = 24; - g_GpuBuffers[0].draw.b0 = 24; - g_GpuBuffers[1].draw.r0 = 40; - g_GpuBuffers[1].draw.g0 = 24; - g_GpuBuffers[1].draw.b0 = 24; -} diff --git a/src/st/dre/11E34.c b/src/st/dre/11E34.c new file mode 100644 index 000000000..1cb4049e1 --- /dev/null +++ b/src/st/dre/11E34.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "dre.h" +#include "sfx.h" + +// clouds in the background ID 0x18 +void EntityBackgroundClouds(Entity* self) { + Primitive* prim; + s16 primIndex; + s32 camX, camY; + + switch (self->step) { + case 0: + InitializeEntity(g_EInitInteractable); + primIndex = g_api.AllocPrimitives(PRIM_GT4, 5); + if (primIndex == -1) { + DestroyEntity(self); + return; + } + prim = &g_PrimBuf[primIndex]; + self->primIndex = primIndex; + self->ext.prim = prim; + self->flags |= FLAG_HAS_PRIMS; + prim->type = PRIM_G4; + prim->x0 = prim->x2 = 0; + prim->x1 = prim->x3 = 0x100; + prim->y0 = prim->y1 = 0x6E - g_Tilemap.scrollY.i.hi; + prim->y2 = prim->y3 = 0xF0; + setRGB0(prim, 16, 16, 16); + prim->priority = 0x20; + prim->drawMode = DRAW_DEFAULT; + LOW(prim->r1) = LOW(prim->r0); + LOW(prim->r2) = LOW(prim->r0); + LOW(prim->r3) = LOW(prim->r0); + prim = prim->next; + camX = -g_Tilemap.scrollX.i.hi; + camY = 32 - g_Tilemap.scrollY.i.hi; + while (prim != 0) { + prim->x0 = prim->x2 = camX; + camX += 95; + prim->x1 = prim->x3 = camX; + prim->tpage = 0xF; + prim->clut = 5; + prim->u0 = prim->u2 = 0x84; + prim->u1 = prim->u3 = 0xE3; + prim->v0 = prim->v1 = 1; + prim->v2 = prim->v3 = 0x4F; + prim->y0 = prim->y1 = camY; + prim->y2 = prim->y3 = camY + 0x4E; + prim->priority = 0x20; + prim->drawMode = DRAW_DEFAULT; + prim = prim->next; + } + break; + + case 255: + /** + * Debug: Press SQUARE / CIRCLE on the second controller + * to advance/rewind current animation frame + */ + FntPrint("charal %x\n", self->animCurFrame); + if (g_pads[1].pressed & PAD_SQUARE) { + if (self->params == 0) { + self->animCurFrame++; + self->params |= 1; + } else { + break; + } + } else { + self->params = 0; + } + if (g_pads[1].pressed & PAD_CIRCLE) { + if (self->step_s == 0) { + self->animCurFrame--; + self->step_s |= 1; + } + } else { + self->step_s = 0; + } + break; + } + g_GpuBuffers[0].draw.r0 = 40; + g_GpuBuffers[0].draw.g0 = 24; + g_GpuBuffers[0].draw.b0 = 24; + g_GpuBuffers[1].draw.r0 = 40; + g_GpuBuffers[1].draw.g0 = 24; + g_GpuBuffers[1].draw.b0 = 24; +} diff --git a/src/st/dre/161DC.c b/src/st/dre/161DC.c index 355cf822e..597272af1 100644 --- a/src/st/dre/161DC.c +++ b/src/st/dre/161DC.c @@ -31,16 +31,16 @@ void EntityCSMoveAlucard(Entity* self) { g_Player.padSim = 0; g_Player.D_80072EFC = 1; if (g_DemoMode != Demo_None) { - self->ext.generic.unk7C.s = 64; + self->ext.utimer.t = 64; } else { - self->ext.generic.unk7C.s = 128; + self->ext.utimer.t = 128; } break; case 1: g_Player.padSim = 0; - if (self->ext.generic.unk7C.u != 0) { - self->ext.generic.unk7C.u--; + if (self->ext.utimer.t != 0) { + self->ext.utimer.t--; } if (g_Player.status & PLAYER_STATUS_TRANSFORM) { if (g_Timer & 1) { @@ -52,7 +52,7 @@ void EntityCSMoveAlucard(Entity* self) { g_Player.padSim = 2; } } - } else if (self->ext.generic.unk7C.u == 0) { + } else if (self->ext.utimer.t == 0) { self->step++; g_Player.padSim = 0x2000; } diff --git a/src/st/dre/dre.h b/src/st/dre/dre.h index 54b0d7da8..59ed387c9 100644 --- a/src/st/dre/dre.h +++ b/src/st/dre/dre.h @@ -1,6 +1,6 @@ // SPDX-License-Identifier: AGPL-3.0-or-later #include "stage.h" -#define STAGE_DRE_H +#define STAGE_IS_DRE #define OVL_EXPORT(x) DRE_##x @@ -58,7 +58,6 @@ void EntityGreyPuff(Entity* entity); extern u16 g_EInitObtainable[]; extern u16 D_8018047C[]; extern u16 g_EInitInteractable[]; -extern u16 D_801804A0[]; extern u16 D_801804D0[]; // EntitySuccubus extern u16 D_801804DC[]; extern u16 D_80180500[]; diff --git a/src/st/dre/e_breakable.c b/src/st/dre/e_breakable.c new file mode 100644 index 000000000..fe55f85f8 --- /dev/null +++ b/src/st/dre/e_breakable.c @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "dre.h" +#include "sfx.h" + +extern u16 g_EInitBreakable[]; +extern u8* g_eBreakableAnimations[]; +extern u8 g_eBreakableHitboxes[]; +extern u8 g_eBreakableExplosionTypes[]; +extern u16 g_eBreakableanimSets[]; +extern u8 g_eBreakableDrawModes[]; + +#include "../e_breakable.h" diff --git a/src/st/dre/st_debug.c b/src/st/dre/st_debug.c new file mode 100644 index 000000000..48bf2ceb1 --- /dev/null +++ b/src/st/dre/st_debug.c @@ -0,0 +1,31 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "dre.h" +#include "sfx.h" + +// puts garbled hp max up text on screen +void EntityUnkId11(Entity* entity) { + ObjInit* obj = (ObjInit*)&D_80180528[entity->params * 10]; + + if (entity->step == 0) { + InitializeEntity(g_EInitCommon); + entity->animSet = obj->animSet; + entity->zPriority = obj->zPriority; + entity->unk5A = obj->unk5A; + entity->palette = obj->palette; + entity->drawFlags = obj->drawFlags; + entity->drawMode = obj->drawMode; + + if (obj->unkC != 0) { + entity->flags = obj->unkC; + } + + if (entity->params == 1) { + entity->rotY = 0x200; + entity->rotX = 0x200; + } + } + + AnimateEntity(obj->animFrames, entity); +} + +#include "../entity_unk_id12.h" diff --git a/src/st/e_bat.h b/src/st/e_bat.h new file mode 100644 index 000000000..ff60e485f --- /dev/null +++ b/src/st/e_bat.h @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +static u8 bat_anim_fly[] = {4, 21, 1, 22, 1, 23, 1, 30, 1, 24, 1, 25, 4, 26, + 2, 27, 2, 28, 2, 29, 1, 30, 2, 23, 2, 22, 0, 0}; +static u8 bat_anim_drop[] = {5, 31, 5, 32, 5, 31, 5, 32, 5, 31, 5, 32, 4, 31, + 4, 32, 3, 31, 3, 32, 2, 31, 12, 32, 255, 0, 0, 0}; + +void EntityBat(Entity* self) { + Entity* newEntity; + s16 xDistance; + s16 yDistance; + + if (self->flags & FLAG_DEAD) { + newEntity = AllocEntity(&g_Entities[224], &g_Entities[256]); + if (newEntity != NULL) { + CreateEntityFromEntity(E_EXPLOSION, self, newEntity); + newEntity->params = 1; + } + PlaySfxPositional(SFX_BAT_SCREECH_SWISH); + DestroyEntity(self); + return; + } + + switch (self->step) { + case 0: + InitializeEntity(g_EInitBat); + self->animCurFrame = 31; + break; + + case 1: + xDistance = GetDistanceToPlayerX(); + yDistance = GetDistanceToPlayerY(); + if ((xDistance < 0x60) && (yDistance < 0x60) && + !(GetSideToPlayer() & 2)) { + self->step++; + } + break; + + case 2: + if (AnimateEntity(bat_anim_drop, self) == 0) { + self->facingLeft = (GetSideToPlayer() & 1) ^ 1; + self->velocityY = FIX(0.875); + if (self->facingLeft) { + self->velocityX = FIX(0.25); + } else { + self->velocityX = FIX(-0.25); + } + self->animFrameIdx = (Random() & 3) * 3; + self->animFrameDuration = 0; + self->step++; + } + break; + + case 3: + AnimateEntity(bat_anim_fly, self); + MoveEntity(); + if (GetDistanceToPlayerY() < 0x20) { + if (self->facingLeft) { + self->velocityX = FIX(1); + } else { + self->velocityX = FIX(-1); + } + self->ext.batEnemy.accelY = 0x800; + self->step++; + } + break; + + case 4: + AnimateEntity(bat_anim_fly, self); + MoveEntity(); + if (self->velocityY < FIX(-1) || self->velocityY > FIX(1)) { + self->ext.batEnemy.accelY = -self->ext.batEnemy.accelY; + } + // accelY is already an s32, but psp needs the cast. I dunno. + self->velocityY += (s32)self->ext.batEnemy.accelY; + break; + } +} diff --git a/src/st/entity_unk_id12.h b/src/st/entity_unk_id12.h index e336b4ad2..594663017 100644 --- a/src/st/entity_unk_id12.h +++ b/src/st/entity_unk_id12.h @@ -18,20 +18,20 @@ static u16 g_EntityUnkId12TilemapProps[] = { 0x0000, 0x0000, 0x0500, 0x0400, 0x0000, 0x0000, 0x0500, 0x0400, 0x0000, 0x01FC, 0x0500, 0x02FC, 0x00F0, 0x01FC, 0x0310, 0x02FC, 0x00F0, 0x01FC, 0x0310, 0x02FC, -#if defined(STAGE_IS_NO3) +#if defined(STAGE_IS_NO3) || defined(STAGE_IS_DRE) 0x0104, 0x0204, 0x0000, 0x0000, 0x0004, 0x0004, 0x0000, 0x0000 #endif }; extern u16 g_EInitUnkId12[]; -void EntityUnkId12(Entity* entity) { +void EntityUnkId12(Entity* self) { u16 var_s0; u16 params; u16* tilemapProps; - entity->unk6D[0] = 0; - params = entity->params; - if (entity->step) { + self->unk6D[0] = 0; + params = self->params; + if (self->step) { switch (params) { case 4: case 5: @@ -43,15 +43,15 @@ void EntityUnkId12(Entity* entity) { if (g_pads->pressed & PAD_TRIANGLE) { g_Tilemap.x = 0; g_Tilemap.width = 1280; - entity->step++; + self->step++; return; } break; } - if (entity->hitParams) { + if (self->hitParams) { var_s0 = GetSideToPlayer(); - if (entity->ext.generic.unk7C.u) { + if (self->ext.ent12.unk7C) { var_s0 &= 2; var_s0 *= 2; } else { @@ -67,13 +67,13 @@ void EntityUnkId12(Entity* entity) { } } else { InitializeEntity(g_EInitUnkId12); - var_s0 = entity->ext.generic.unk7C.u = g_EntityUnkId12Data[params]; + var_s0 = self->ext.ent12.unk7C = g_EntityUnkId12Data[params]; if (var_s0) { - entity->hitboxWidth = g_EntityUnkId12Hitbox[params]; - entity->hitboxHeight = 16; + self->hitboxWidth = g_EntityUnkId12Hitbox[params]; + self->hitboxHeight = 16; } else { - entity->hitboxWidth = 16; - entity->hitboxHeight = g_EntityUnkId12Hitbox[params]; + self->hitboxWidth = 16; + self->hitboxHeight = g_EntityUnkId12Hitbox[params]; } } } diff --git a/src/st/entrance_stage_entities.h b/src/st/entrance_stage_entities.h index 353c03765..895d79537 100644 --- a/src/st/entrance_stage_entities.h +++ b/src/st/entrance_stage_entities.h @@ -414,10 +414,10 @@ static SVECTOR* doorColorNormalVectors[] = { static u8 castleDoorUCoords[] = { 0x3A, 0x46, 0x01, 0x35, 0x35, 0x01, 0x00, 0x00}; -static s16 castleDoorTilesOpen[] = { +static u16 castleDoorTilesOpen[] = { 0x06D1, 0x06D2, 0x06D3, 0x06D4, 0x06D5, 0x06D6, 0x06D3, 0x06D4, }; -static s16 castleDoorTilesShut[] = { +static u16 castleDoorTilesShut[] = { 0x010F, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x114, 0x116, }; diff --git a/src/st/mad/D8C8.c b/src/st/mad/D8C8.c index 6d3cb5545..286869770 100644 --- a/src/st/mad/D8C8.c +++ b/src/st/mad/D8C8.c @@ -92,100 +92,3 @@ void func_8018E13C(u16* tilemap) { void func_8018E1D4(void); INCLUDE_ASM("asm/us/st/mad/nonmatchings/D8C8", func_8018E1D4); - -void func_8018E5AC(Entity* self) { - s32 temp_v0; - ObjInit* objInit = &D_8018056C[self->params]; - - if (self->step == 0) { - InitializeEntity(g_EInitCommon); - self->animSet = objInit->animSet; - self->zPriority = objInit->zPriority; - self->unk5A = objInit->unk5A; - self->palette = objInit->palette; - self->drawFlags = objInit->drawFlags; - self->drawMode = objInit->drawMode; - temp_v0 = objInit->unkC; - if (temp_v0 != 0) { - self->flags = temp_v0; - } - } - AnimateEntity(objInit->animFrames, self); -} - -void func_8018E674(Entity* self) { - u16 var_s0; - u16 params; - u16* tilemapProps; - - self->unk6D[0] = 0; - params = self->params; - if (self->step) { - switch (params) { - case 4: - case 5: - if (g_Tilemap.x) { - return; - } - break; - case 6: - if (g_pads->pressed & PAD_TRIANGLE) { - g_Tilemap.x = 0; - g_Tilemap.width = 1280; - self->step++; - return; - } - break; - } - if (self->hitParams) { - var_s0 = GetSideToPlayer(); - if (self->ext.generic.unk7C.u) { - var_s0 &= 2; - var_s0 *= 2; - } else { - var_s0 &= 1; - var_s0 *= 4; - } - params = (params << 3) + var_s0; - tilemapProps = &D_801805C4[params]; - g_Tilemap.x = *tilemapProps++; - g_Tilemap.y = *tilemapProps++; - g_Tilemap.width = *tilemapProps++; - g_Tilemap.height = *tilemapProps; - } - } else { - InitializeEntity(D_80180538); - var_s0 = self->ext.timer.t = D_801805BC[params]; - if (var_s0) { - self->hitboxWidth = D_801805B4[params]; - self->hitboxHeight = 16; - return; - } - self->hitboxWidth = 16; - self->hitboxHeight = D_801805B4[params]; - } -} - -void EntityBreakable(Entity* entity) { - u16 breakableType = entity->params >> 0xC; - if (entity->step) { - AnimateEntity(g_eBreakableAnimations[breakableType], entity); - if (entity->hitParams) { // If the candle is destroyed - Entity* entityDropItem; - g_api.PlaySfx(SFX_CANDLE_HIT); - entityDropItem = AllocEntity(&g_Entities[224], &g_Entities[256]); - if (entityDropItem != NULL) { - CreateEntityFromCurrentEntity(E_EXPLOSION, entityDropItem); - entityDropItem->params = - g_eBreakableExplosionTypes[breakableType]; - } - ReplaceBreakableWithItemDrop(entity); - } - } else { - InitializeEntity(g_EInitBreakable); - entity->zPriority = g_unkGraphicsStruct.g_zEntityCenter - 0x14; - entity->drawMode = g_eBreakableDrawModes[breakableType]; - entity->hitboxHeight = g_eBreakableHitboxes[breakableType]; - entity->animSet = g_eBreakableanimSets[breakableType]; - } -} diff --git a/src/st/mad/e_breakable.c b/src/st/mad/e_breakable.c new file mode 100644 index 000000000..fc4813aff --- /dev/null +++ b/src/st/mad/e_breakable.c @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "mad.h" +#include "sfx.h" + +#include "../e_breakable.h" diff --git a/src/st/mad/st_debug.c b/src/st/mad/st_debug.c new file mode 100644 index 000000000..ac3b048ed --- /dev/null +++ b/src/st/mad/st_debug.c @@ -0,0 +1,25 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "mad.h" +#include "sfx.h" + +void func_8018E5AC(Entity* self) { + s32 temp_v0; + ObjInit* objInit = &D_8018056C[self->params]; + + if (self->step == 0) { + InitializeEntity(g_EInitCommon); + self->animSet = objInit->animSet; + self->zPriority = objInit->zPriority; + self->unk5A = objInit->unk5A; + self->palette = objInit->palette; + self->drawFlags = objInit->drawFlags; + self->drawMode = objInit->drawMode; + temp_v0 = objInit->unkC; + if (temp_v0 != 0) { + self->flags = temp_v0; + } + } + AnimateEntity(objInit->animFrames, self); +} + +#include "../entity_unk_id12.h" diff --git a/src/st/no3/3E134.c b/src/st/no3/3E134.c index b1a709ad7..d13c7f5b7 100644 --- a/src/st/no3/3E134.c +++ b/src/st/no3/3E134.c @@ -32,13 +32,13 @@ void EntityFlyingOwlAndLeaves(Entity* entity) { case 1: if (entity->posX.i.hi < 224) { - entity->ext.generic.unk7C.s = 0; + entity->ext.timer.t = 0; entity->step++; } break; case 2: - if (!(entity->ext.generic.unk7C.s++ & 7)) { + if (!(entity->ext.timer.t++ & 7)) { g_api.PlaySfx(SE_TREE_BRANCH); } if (entity->posX.i.hi < 192) { diff --git a/src/st/no3/3FF00.c b/src/st/no3/3FF00.c index 98c6f6595..c70023abe 100644 --- a/src/st/no3/3FF00.c +++ b/src/st/no3/3FF00.c @@ -243,7 +243,7 @@ void EntityDeathStolenItem(Entity* self) { } void EntityDeath(Entity* self) { - Entity* newEntity = &self[1]; + Entity* newEntity = self + 1; Primitive* prim; s16 left, right; s32 primIndex; @@ -301,7 +301,7 @@ void EntityDeath(Entity* self) { self->ext.death.unk7C = 0; self->flags |= FLAG_HAS_PRIMS; DestroyEntity(newEntity); - CreateEntityFromCurrentEntity(E_DEATH_5B, newEntity); + CreateEntityFromCurrentEntity(E_DEATH_SCYTHE, newEntity); prim = &g_PrimBuf[primIndex]; for (i = 0; prim != NULL; i++) { @@ -562,46 +562,51 @@ void EntityDeath(Entity* self) { } } -void EntityUnkId5B(Entity* entity) { - Entity* newEntity; +// Not 100% sure about this entity, but since it's making scythe shadows, +// going to guess it's the scythe. +void EntityDeathScythe(Entity* self) { + u16 tempstep; + // this is Death. + Entity* otherEntity = self - 1; + self->posX.i.hi = otherEntity->posX.i.hi; + self->posY.i.hi = otherEntity->posY.i.hi; - entity->posX.i.hi = entity[-1].posX.i.hi; - entity->posY.i.hi = entity[-1].posY.i.hi; - - switch (entity->step) { + switch (self->step) { case 0: InitializeEntity(g_EInitCommon); - entity->animSet = ANIMSET_OVL(8); - entity->palette = 0x2D6; - entity->animCurFrame = 0; - entity->unk5A = 0x44; + self->animSet = ANIMSET_OVL(8); + self->animCurFrame = 0; + self->palette = 0x2D6; + self->unk5A = 0x44; break; case 1: - if (entity->ext.generic.unk7C.u != 0) { - switch (entity->ext.generic.unk7C.u) { + tempstep = self->ext.deathScythe.extStep; + if (tempstep) { + switch (tempstep) { case 1: - AnimateEntity(D_80181B40, entity); + AnimateEntity(D_80181B40, self); break; case 2: - AnimateEntity(D_80181B4C, entity); + AnimateEntity(D_80181B4C, self); break; case 3: - AnimateEntity(D_80181B4C, entity); - newEntity = AllocEntity(&g_Entities[224], &g_Entities[256]); - if (newEntity == NULL) { + AnimateEntity(D_80181B4C, self); + otherEntity = AllocEntity(&g_Entities[224], &g_Entities[256]); + if (otherEntity == NULL) { break; } - CreateEntityFromCurrentEntity(E_DEATH_SCYTHE_SHADOW, newEntity); - newEntity->animCurFrame = entity->animCurFrame; - newEntity->params = 1; + CreateEntityFromCurrentEntity( + E_DEATH_SCYTHE_SHADOW, otherEntity); + otherEntity->animCurFrame = self->animCurFrame; + otherEntity->params = 1; break; } } else { - entity->animCurFrame = 0; + self->animCurFrame = 0; } } - entity->ext.generic.unk7C.s = 0; + self->ext.deathScythe.extStep = 0; } // When meeting Death, the scythe spins around, leaving behind semi-transparent diff --git a/src/st/no3/56264.c b/src/st/no3/56264.c deleted file mode 100644 index f070029fd..000000000 --- a/src/st/no3/56264.c +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -#include "no3.h" -#include "sfx.h" - -void EntityBat(Entity* entity) { - Entity* newEntity; - s16 xDistance; - s16 yDistance; - - if (entity->flags & FLAG_DEAD) { - newEntity = AllocEntity(&g_Entities[224], &g_Entities[256]); - if (newEntity != NULL) { - CreateEntityFromEntity(E_EXPLOSION, entity, newEntity); - newEntity->params = 1; - } - PlaySfxPositional(SFX_BAT_SCREECH_SWISH); - DestroyEntity(entity); - return; - } - - switch (entity->step) { - case 0: - InitializeEntity(D_80180B90); - entity->animCurFrame = 31; - break; - - case 1: - xDistance = GetDistanceToPlayerX(); - yDistance = GetDistanceToPlayerY(); - if ((xDistance < 0x60) && (yDistance < 0x60) && - !(GetSideToPlayer() & 2)) { - entity->step++; - } - break; - - case 2: - if (AnimateEntity(D_80183C60, entity) == 0) { - entity->facingLeft = (GetSideToPlayer() & 1) ^ 1; - entity->velocityY = FIX(0.875); - if (entity->facingLeft != 0) { - entity->velocityX = FIX(0.25); - } else { - entity->velocityX = FIX(-0.25); - } - entity->animFrameIdx = (Random() & 3) * 3; - entity->animFrameDuration = 0; - entity->step++; - } - break; - - case 3: - AnimateEntity(D_80183C44, entity); - MoveEntity(); - if (GetDistanceToPlayerY() < 0x20) { - if (entity->facingLeft == 0) { - entity->velocityX = FIX(-1); - } else { - entity->velocityX = FIX(1); - } - *(s32*)&entity->ext.generic.unk7C.s = 0x800; - entity->step++; - } - break; - - case 4: - AnimateEntity(D_80183C44, entity); - MoveEntity(); - if ((u32)(entity->velocityY + 0x10000) > 0x20000U) { - *(s32*)&entity->ext.generic.unk7C.s = - (s32) - *(s32*)&entity->ext.generic.unk7C.s; - } - entity->velocityY += *(s32*)&entity->ext.generic.unk7C.u; - break; - } -} diff --git a/src/st/no3/e_bat.c b/src/st/no3/e_bat.c new file mode 100644 index 000000000..1a7ffe61a --- /dev/null +++ b/src/st/no3/e_bat.c @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "no3.h" + +#include "../e_bat.h" diff --git a/src/st/no3/e_init.c b/src/st/no3/e_init.c index bf53c9753..f107aa5f7 100644 --- a/src/st/no3/e_init.c +++ b/src/st/no3/e_init.c @@ -91,7 +91,7 @@ void NO3_EntityCutscene(Entity* self); void EntityRoomTransition2(Entity* self); void EntityDeathStolenItem(Entity* self); void EntityDeath(Entity* self); -void EntityUnkId5B(Entity* self); +void EntityDeathScythe(Entity* self); void EntityStairwayPiece(Entity* self); void EntityFallingRock(Entity* self); void EntityDeathScytheShadow(Entity* self); @@ -191,7 +191,7 @@ PfnEntityUpdate OVL_EXPORT(EntityUpdates)[] = { EntityRoomTransition2, EntityDeathStolenItem, EntityDeath, - EntityUnkId5B, + EntityDeathScythe, EntityStairwayPiece, EntityFallingRock, EntityDeathScytheShadow, diff --git a/src/st/no3/no3.h b/src/st/no3/no3.h index d1d7b06e5..67679f334 100644 --- a/src/st/no3/no3.h +++ b/src/st/no3/no3.h @@ -78,7 +78,7 @@ typedef enum EntityIDs { /* 0x4B */ E_ID_4B = 0x4B, /* 0x4C */ E_ZOMBIE, /* 0x59 */ E_ID_59 = 0x59, - /* 0x5B */ E_DEATH_5B = 0x5B, + /* 0x5B */ E_DEATH_SCYTHE = 0x5B, /* 0x5D */ E_FALLING_ROCK = 0x5D, /* 0x5E */ E_DEATH_SCYTHE_SHADOW, /* 0x60 */ E_FLYING_OWL_UNK60 = 0x60, @@ -111,7 +111,7 @@ extern u16 D_80180B30[]; extern u16 g_EInitWaterObject[]; extern u16 g_EInitWaterSplash[]; extern u16 D_80180B6C[]; -extern u16 D_80180B90[]; +extern u16 g_EInitBat[]; extern u16 D_80180BA8[]; extern ObjInit2 D_80180BFC[]; extern u8 D_80180DC0[]; diff --git a/src/st/np3/4997C.c b/src/st/np3/4997C.c deleted file mode 100644 index 88dbfd73a..000000000 --- a/src/st/np3/4997C.c +++ /dev/null @@ -1,74 +0,0 @@ -// SPDX-License-Identifier: AGPL-3.0-or-later -#include "np3.h" -#include "sfx.h" - -void EntityBat(Entity* entity) { - Entity* newEntity; - s16 xDistance; - s16 yDistance; - - if (entity->flags & FLAG_DEAD) { - newEntity = AllocEntity(&g_Entities[224], &g_Entities[256]); - if (newEntity != NULL) { - CreateEntityFromEntity(E_EXPLOSION, entity, newEntity); - newEntity->params = 1; - } - PlaySfxPositional(SFX_BAT_SCREECH_SWISH); - DestroyEntity(entity); - return; - } - - switch (entity->step) { - case 0: - InitializeEntity(g_EInitBat); - entity->animCurFrame = 31; - break; - - case 1: - xDistance = GetDistanceToPlayerX(); - yDistance = GetDistanceToPlayerY(); - if ((xDistance < 96) && (yDistance < 96) && !(GetSideToPlayer() & 2)) { - entity->step++; - } - break; - - case 2: - if (AnimateEntity(D_80182570, entity) == 0) { - entity->facingLeft = (GetSideToPlayer() & 1) ^ 1; - entity->velocityY = FIX(0.875); - if (entity->facingLeft != 0) { - entity->velocityX = FIX(0.25); - } else { - entity->velocityX = FIX(-0.25); - } - entity->animFrameIdx = (Random() & 3) * 3; - entity->animFrameDuration = 0; - entity->step++; - } - break; - - case 3: - AnimateEntity(D_80182554, entity); - MoveEntity(); - if (GetDistanceToPlayerY() < 0x20) { - if (entity->facingLeft == 0) { - entity->velocityX = FIX(-1); - } else { - entity->velocityX = FIX(1); - } - *(s32*)&entity->ext.generic.unk7C.s = 0x800; - entity->step++; - } - break; - - case 4: - AnimateEntity(D_80182554, entity); - MoveEntity(); - if ((u32)(entity->velocityY + 0x10000) > 0x20000U) { - *(s32*)&entity->ext.generic.unk7C.s = - (s32) - *(s32*)&entity->ext.generic.unk7C.s; - } - entity->velocityY += *(s32*)&entity->ext.generic.unk7C.u; - break; - } -} diff --git a/src/st/np3/e_bat.c b/src/st/np3/e_bat.c new file mode 100644 index 000000000..88468a1d0 --- /dev/null +++ b/src/st/np3/e_bat.c @@ -0,0 +1,4 @@ +// SPDX-License-Identifier: AGPL-3.0-or-later +#include "np3.h" + +#include "../e_bat.h" diff --git a/src/st/np3/np3.h b/src/st/np3/np3.h index 07992d41c..516f286b4 100644 --- a/src/st/np3/np3.h +++ b/src/st/np3/np3.h @@ -112,7 +112,6 @@ extern u16 g_EInitMerman[]; extern u16 g_EInitMermanFireball[]; extern u16 D_80180AF0[]; extern u16 g_EInitBat[]; -extern u16 g_EInitBat[]; extern u16 g_EInitZombie[]; extern u16 D_80180B20[]; extern u16 g_EInitSlograSpearNP3[]; @@ -221,8 +220,6 @@ extern u8 D_80182414[]; extern s32 D_80182440[]; extern u8 D_80182454[]; extern u16 D_80182458[]; -extern u8 D_80182554[]; -extern u8 D_80182570[]; extern u8 D_8018258C[]; extern u8 D_80182594[]; extern u8 D_801825A8[]; diff --git a/src/st/nz0/311C0.c b/src/st/nz0/311C0.c index 91fcf3b3a..e4188e42c 100644 --- a/src/st/nz0/311C0.c +++ b/src/st/nz0/311C0.c @@ -1002,9 +1002,9 @@ void EntityFloorButton(Entity* self) { if ((self->ext.nz0311c0.unk80 + 4) < posY) { self->posY.i.hi = (self->ext.nz0311c0.unk80 + 4) - g_Tilemap.scrollY.i.hi; - self[1].ext.stub[0xC] = 1; + (self + 1)->ext.nz0311c0.unk88 = 1; self->step++; - LOW(self[1].ext.stub[0x8]) ^= 1; + (self + 1)->ext.nz0311c0.unk84 ^= 1; } } diff --git a/src/st/st0/27D64.c b/src/st/st0/27D64.c index db8be7e69..8d7161ad5 100644 --- a/src/st/st0/27D64.c +++ b/src/st/st0/27D64.c @@ -187,7 +187,7 @@ void func_801A8328(Entity* self) { if (firstPrimIndex != -1) { prim = &g_PrimBuf[firstPrimIndex]; self->primIndex = firstPrimIndex; - LOW(self->ext.generic.unk7C.s) = prim; + self->ext.prim = prim; self->flags |= FLAG_HAS_PRIMS; UnkPolyFunc2(prim); prim->tpage = 0x16; @@ -218,7 +218,7 @@ void func_801A8328(Entity* self) { case 1: MoveEntity(); - prim = LOW(self->ext.generic.unk7C.s); + prim = self->ext.prim; self->velocityY += FIX(0.125); prim->next->x1 = self->posX.i.hi; prim->next->y0 = self->posY.i.hi; diff --git a/src/st/st0/2A218.c b/src/st/st0/2A218.c index c3106c25a..dca521cc4 100644 --- a/src/st/st0/2A218.c +++ b/src/st/st0/2A218.c @@ -23,7 +23,7 @@ void EntityCutscene(Entity* self) { self->posY.i.hi = player->posY.i.hi - 1; if ((self->step != 14) && g_SkipCutscene && g_IsCutsceneDone && - (self->step >= 5)) { + (self->step > 4)) { self->step = 15; self->animSet = ANIMSET_DRA(0); self->animCurFrame = 0; @@ -37,8 +37,8 @@ void EntityCutscene(Entity* self) { break; case 1: - if (self->step_s != 0) { - if ((player->step < 3) || (player->step == 25)) { + if (self->step_s) { + if ((player->step <= 2) || (player->step == 25)) { posX = player->posX.i.hi + tilemap->scrollX.i.hi; if (posX > 0x8000) { posX = 0; @@ -48,7 +48,7 @@ void EntityCutscene(Entity* self) { } else { g_Player.padSim = PAD_RIGHT; } - g_Entities[1].ext.generic.unk7C.S8.unk0 = 1; + g_Entities[1].ext.entSlot1.unk0 = 1; g_Player.D_80072EFC = 0xFF; func_801AA218(posX); SetStep(2); @@ -67,11 +67,11 @@ void EntityCutscene(Entity* self) { posX = 0; } - if ((g_Player.padSim == 0x8000) && (posX <= 0xA0) || - (g_Player.padSim == 0x2000) && (posX >= 0x9F)) { + if ((g_Player.padSim == PAD_LEFT) && (posX <= 0xA0) || + (g_Player.padSim == PAD_RIGHT) && (posX >= 0x9F)) { g_Player.D_80072EFC = 1; g_Player.padSim = PAD_LEFT; - self->ext.generic.unk7C.s = 0x18; + self->ext.utimer.t = 0x18; g_CutsceneFlags |= 1; self->step++; } @@ -86,7 +86,7 @@ void EntityCutscene(Entity* self) { func_801AA218(posX); g_Player.D_80072EFC = 1; g_Player.padSim = 0; - if (!--self->ext.generic.unk7C.u) { + if (!--self->ext.utimer.t) { SetStep(4); } break; diff --git a/src/st/st0/2B0C8.c b/src/st/st0/2B0C8.c index b85b0acec..5c2950642 100644 --- a/src/st/st0/2B0C8.c +++ b/src/st/st0/2B0C8.c @@ -705,6 +705,7 @@ u32 func_801ABBBC(s32 step, Entity* dracula) { return step; } +// This function is not called from anywhere. Don't know what it's for. s32 func_801AC458(s16 arg0) { s32 ret = arg0; Entity* e; @@ -728,7 +729,8 @@ s32 func_801AC458(s16 arg0) { ret++; } if (e2->animFrameIdx == 6 && e2->animFrameDuration == 0) { - g_CurrentEntity->ext.stub[0x24] = 1; + // Using dracula ext since this function is right after dracula. + g_CurrentEntity->ext.dracula.unkA0 = 1; } break; diff --git a/src/st/st0/st0.h b/src/st/st0/st0.h index 8ae8775a4..127231a12 100644 --- a/src/st/st0/st0.h +++ b/src/st/st0/st0.h @@ -160,8 +160,6 @@ extern u32 D_80181CF0[]; extern s8 D_801A7B7C; extern Point32 D_801BEB64[]; extern s32 D_801C2578; -extern u32 g_CutsceneFlags; -extern s32 D_801C2578; // *** EntityDracula properties END *** @@ -177,9 +175,7 @@ extern u8 D_801824CC[]; extern s8 D_801A7BDC; extern Point32 D_801BEB64[]; -extern s32 g_SkipCutscene; extern s32 D_801C2578; -extern s32 g_IsCutsceneDone; // *** EntitySoulStealOrb properties START *** diff --git a/src/st/unk_anim_func.h b/src/st/unk_anim_func.h index cf560353d..b5f6be4dc 100644 --- a/src/st/unk_anim_func.h +++ b/src/st/unk_anim_func.h @@ -1,4 +1,13 @@ // SPDX-License-Identifier: AGPL-3.0-or-later + +// Notably, this is completely unused. +// The use of the 0xBB offset in the entity, which does not match the current +// entity struct, suggests that this was for an older form of Entity. +// When the Entity was changed, this function was already unused, so was never +// updated. This is just a theory though. + +#define SELF_BB (*((u8*)&self->unkB8 + 3)) + u8 UnkAnimFunc(u8 frames[], Entity* self, u8 arg2) { u16 animFrameStart = self->animFrameIdx * 2; u8* var_s1 = &frames[animFrameStart]; @@ -9,7 +18,7 @@ u8 UnkAnimFunc(u8 frames[], Entity* self, u8 arg2) { if (*var_s1 == 0xFF) { return 0; } - self->animFrameDuration = *var_s1++ + (u8)self->ext.stub[0x3F]; + self->animFrameDuration = *var_s1++ + SELF_BB; self->animCurFrame = *var_s1++; self->animFrameIdx++; var_a1 = 128; @@ -17,8 +26,8 @@ u8 UnkAnimFunc(u8 frames[], Entity* self, u8 arg2) { var_s1 = frames; self->animFrameIdx = 0; self->animFrameDuration = 0; - self->ext.stub[0x3F] = (arg2 * Random()) >> 8; - self->animFrameDuration = *var_s1++ + (u8)self->ext.stub[0x3F]; + SELF_BB = (arg2 * Random()) >> 8; + self->animFrameDuration = *var_s1++ + SELF_BB; self->animCurFrame = *var_s1; self->animFrameIdx++; return 0; diff --git a/src/weapon/w_015.c b/src/weapon/w_015.c index 1d38d7614..75dd51d68 100644 --- a/src/weapon/w_015.c +++ b/src/weapon/w_015.c @@ -117,7 +117,7 @@ s32 func_ptr_80170004(Entity* self) { self->flags = FLAG_POS_CAMERA_LOCKED; self->palette = self->ext.weapon.parent->palette; self->unk5A = self->ext.weapon.parent->unk5A; - self->ext.generic.unk7C.s = 10; + self->ext.timer.t = 10; self->drawMode = DRAW_TPAGE; self->drawFlags = FLAG_DRAW_UNK8; self->unk6C = 0x80; @@ -127,7 +127,7 @@ s32 func_ptr_80170004(Entity* self) { self->unk6C += 0xF8; } - if (--self->ext.generic.unk7C.s == 0) { + if (--self->ext.timer.t == 0) { DestroyEntity(self); } }