Hardcode Hanagumi Hall

This commit is contained in:
Lach 2023-10-13 23:48:24 +11:00
parent c72a2cf94a
commit 58a6a85b04
4 changed files with 162 additions and 0 deletions

View file

@ -4381,6 +4381,17 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_SPECIALSTAGEBOMB_FLICKERLOOP", "S_SPECIALSTAGEBOMB_FLICKERLOOP",
"S_SPECIALSTAGEBOMB_RESET", "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 // SMK ports
"S_SMK_PIPE1", // Generic pipes "S_SMK_PIPE1", // Generic pipes
"S_SMK_PIPE2", "S_SMK_PIPE2",
@ -5762,6 +5773,10 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_SPECIALSTAGEARCH", "MT_SPECIALSTAGEARCH",
"MT_SPECIALSTAGEBOMB", "MT_SPECIALSTAGEBOMB",
// Hanagumi Hall
"MT_HANAGUMIHALL_STEAM",
"MT_HANAGUMIHALL_NPC",
// SMK ports // SMK ports
"MT_SMK_PIPE", "MT_SMK_PIPE",
"MT_SMK_MOLESPAWNER", "MT_SMK_MOLESPAWNER",

View file

@ -801,6 +801,17 @@ char sprnames[NUMSPRITES + 1][5] =
"SARC", "SARC",
"SSBM", "SSBM",
// Hanagumi Hall
"HGSP",
"HGC0",
"HGCA",
"HGCB",
"HGCC",
"HGCD",
"HGCE",
"HGCF",
"HGCG",
// SMK ports // SMK ports
"SMKP", "SMKP",
"MTYM", "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_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 {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 // SMK ports
{SPR_SMKP, 0, -1, {NULL}, 0, 0, S_SMK_PIPE1}, // S_SMK_PIPE1 {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 {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 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 { // MT_SMK_PIPE
3970, // doomednum 3970, // doomednum
S_SMK_PIPE1, // spawnstate S_SMK_PIPE1, // spawnstate

View file

@ -1357,6 +1357,17 @@ typedef enum sprite
SPR_SARC, SPR_SARC,
SPR_SSBM, SPR_SSBM,
// Hanagumi Hall
SPR_HGSP,
SPR_HGC0,
SPR_HGCA,
SPR_HGCB,
SPR_HGCC,
SPR_HGCD,
SPR_HGCE,
SPR_HGCF,
SPR_HGCG,
// SMK ports // SMK ports
SPR_SMKP, SPR_SMKP,
SPR_MTYM, SPR_MTYM,
@ -5561,6 +5572,17 @@ typedef enum state
S_SPECIALSTAGEBOMB_FLICKERLOOP, S_SPECIALSTAGEBOMB_FLICKERLOOP,
S_SPECIALSTAGEBOMB_RESET, 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 // SMK ports
S_SMK_PIPE1, // Generic pipes S_SMK_PIPE1, // Generic pipes
S_SMK_PIPE2, S_SMK_PIPE2,
@ -6981,6 +7003,10 @@ typedef enum mobj_type
MT_SPECIALSTAGEARCH, MT_SPECIALSTAGEARCH,
MT_SPECIALSTAGEBOMB, MT_SPECIALSTAGEBOMB,
// Hanagumi Hall
MT_HANAGUMIHALL_STEAM,
MT_HANAGUMIHALL_NPC,
// SMK ports // SMK ports
MT_SMK_PIPE, MT_SMK_PIPE,
MT_SMK_MOLESPAWNER, MT_SMK_MOLESPAWNER,

View file

@ -10596,6 +10596,9 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj)
return 5*FRACUNIT; return 5*FRACUNIT;
case MT_SPECIALSTAGEBOMB: case MT_SPECIALSTAGEBOMB:
return 3*FRACUNIT/4; return 3*FRACUNIT/4;
case MT_HANAGUMIHALL_STEAM:
case MT_HANAGUMIHALL_NPC:
return 2*FRACUNIT;
default: default:
break; break;
} }
@ -13704,6 +13707,48 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
break; 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: case MT_BATTLECAPSULE:
{ {
sector_t *sec = R_PointInSubsector(mobj->x, mobj->y)->sector; sector_t *sec = R_PointInSubsector(mobj->x, mobj->y)->sector;