From 58a6a85b045ea00daa714e14d6c3f11d99bcf796 Mon Sep 17 00:00:00 2001 From: Lach Date: Fri, 13 Oct 2023 23:48:24 +1100 Subject: [PATCH] Hardcode Hanagumi Hall --- src/deh_tables.c | 15 ++++++++++ src/info.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ src/info.h | 26 +++++++++++++++++ src/p_mobj.c | 45 ++++++++++++++++++++++++++++ 4 files changed, 162 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index b73c08662..cc992f471 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4381,6 +4381,17 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_SPECIALSTAGEBOMB_FLICKERLOOP", "S_SPECIALSTAGEBOMB_RESET", + // Hanagumi Hall + "S_HANAGUMIHALL_STEAM", + "S_ALFONSO", + "S_SAKURA", + "S_SUMIRE", + "S_MARIA", + "S_IRIS", + "S_KOHRAN", + "S_KANNA", + "S_OGAMI", + // SMK ports "S_SMK_PIPE1", // Generic pipes "S_SMK_PIPE2", @@ -5762,6 +5773,10 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_SPECIALSTAGEARCH", "MT_SPECIALSTAGEBOMB", + // Hanagumi Hall + "MT_HANAGUMIHALL_STEAM", + "MT_HANAGUMIHALL_NPC", + // SMK ports "MT_SMK_PIPE", "MT_SMK_MOLESPAWNER", diff --git a/src/info.c b/src/info.c index e8750b76b..63b243118 100644 --- a/src/info.c +++ b/src/info.c @@ -801,6 +801,17 @@ char sprnames[NUMSPRITES + 1][5] = "SARC", "SSBM", + // Hanagumi Hall + "HGSP", + "HGC0", + "HGCA", + "HGCB", + "HGCC", + "HGCD", + "HGCE", + "HGCF", + "HGCG", + // SMK ports "SMKP", "MTYM", @@ -5125,6 +5136,17 @@ state_t states[NUMSTATES] = {SPR_NULL, 0, 0, {A_Repeat}, TICRATE, S_SPECIALSTAGEBOMB_FLICKER1, S_SPECIALSTAGEBOMB_RESET}, // S_SPECIALSTAGEBOMB_FLICKERLOOP {SPR_NULL, 0, 0, {A_SetObjectFlags}, MF_NOCLIPTHING, 1, S_SPECIALSTAGEBOMB}, // S_SPECIALSTAGEBOMB_RESET + // Hanagumi Hall + {SPR_HGSP, FF_FULLBRIGHT|FF_ANIMATE, -1, {NULL}, 10, 1, S_NULL}, // S_HANAGUMIHALL_STEAM + {SPR_HGC0, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ALFONSO + {SPR_HGCA, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SAKURA + {SPR_HGCB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SUMIRE + {SPR_HGCC, 0, -1, {NULL}, 0, 0, S_NULL}, // S_MARIA + {SPR_HGCD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_IRIS + {SPR_HGCE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KOHRAN + {SPR_HGCF, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KANNA + {SPR_HGCG, 0, -1, {NULL}, 0, 0, S_NULL}, // S_OGAMI + // SMK ports {SPR_SMKP, 0, -1, {NULL}, 0, 0, S_SMK_PIPE1}, // S_SMK_PIPE1 {SPR_SMKP, 1, -1, {NULL}, 0, 0, S_SMK_PIPE2}, // S_SMK_PIPE2 @@ -28415,6 +28437,60 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_SPECIALSTAGEBOMB_EXPLODE // raisestate }, + { // MT_HANAGUMIHALL_STEAM + 2023, // doomednum + S_HANAGUMIHALL_STEAM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 24*FRACUNIT, // radius + 48*FRACUNIT, // height + 0, // dispoffset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_SCENERY|MF_NOBLOCKMAP|MF_NOCLIPTHING, // flags + S_NULL // raisestate + }, + + { // MT_HANAGUMIHALL_NPC + 2024, // doomednum + S_ALFONSO, // spawnstate + 1, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 64*FRACUNIT, // radius + 128*FRACUNIT, // height + 0, // dispoffset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_DONTENCOREMAP|MF_NOCLIP|MF_SCENERY|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + { // MT_SMK_PIPE 3970, // doomednum S_SMK_PIPE1, // spawnstate diff --git a/src/info.h b/src/info.h index 3400928ed..9c0a2cb0a 100644 --- a/src/info.h +++ b/src/info.h @@ -1357,6 +1357,17 @@ typedef enum sprite SPR_SARC, SPR_SSBM, + // Hanagumi Hall + SPR_HGSP, + SPR_HGC0, + SPR_HGCA, + SPR_HGCB, + SPR_HGCC, + SPR_HGCD, + SPR_HGCE, + SPR_HGCF, + SPR_HGCG, + // SMK ports SPR_SMKP, SPR_MTYM, @@ -5561,6 +5572,17 @@ typedef enum state S_SPECIALSTAGEBOMB_FLICKERLOOP, S_SPECIALSTAGEBOMB_RESET, + // Hanagumi Hall + S_HANAGUMIHALL_STEAM, + S_ALFONSO, + S_SAKURA, + S_SUMIRE, + S_MARIA, + S_IRIS, + S_KOHRAN, + S_KANNA, + S_OGAMI, + // SMK ports S_SMK_PIPE1, // Generic pipes S_SMK_PIPE2, @@ -6981,6 +7003,10 @@ typedef enum mobj_type MT_SPECIALSTAGEARCH, MT_SPECIALSTAGEBOMB, + // Hanagumi Hall + MT_HANAGUMIHALL_STEAM, + MT_HANAGUMIHALL_NPC, + // SMK ports MT_SMK_PIPE, MT_SMK_MOLESPAWNER, diff --git a/src/p_mobj.c b/src/p_mobj.c index 12fe75e93..55de4ca5f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10596,6 +10596,9 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj) return 5*FRACUNIT; case MT_SPECIALSTAGEBOMB: return 3*FRACUNIT/4; + case MT_HANAGUMIHALL_STEAM: + case MT_HANAGUMIHALL_NPC: + return 2*FRACUNIT; default: break; } @@ -13704,6 +13707,48 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj) break; } + case MT_HANAGUMIHALL_NPC: + { + UINT8 i; + statenum_t state; + + static const statenum_t HANAGUMIHALL_NPC_STATES[] = { + S_SAKURA, + S_SUMIRE, + S_MARIA, + S_IRIS, + S_KOHRAN, + S_KANNA, + S_OGAMI + }; + static const size_t NUM_HANAGUMIHALL_NPC_STATES = sizeof(HANAGUMIHALL_NPC_STATES) / sizeof(statenum_t); + + // an invalid NPC ID leaves you with Alfonso + if (mthing->thing_args[0] < 0 || mthing->thing_args[0] >= NUM_HANAGUMIHALL_NPC_STATES) + break; + + // pick the state based on the NPC ID + state = HANAGUMIHALL_NPC_STATES[mthing->thing_args[0]]; + + // if the NPC is Sakura, but there is a Sakura player in game, use Alfonso instead + if (state == S_SAKURA) + { + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator == true) + continue; + + if (strcmp(skins[players[i].skin].name, "sakura") == 0) + { + state = mobj->info->spawnstate; + break; + } + } + } + + P_SetMobjState(mobj, state); + break; + } case MT_BATTLECAPSULE: { sector_t *sec = R_PointInSubsector(mobj->x, mobj->y)->sector;