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_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",

View file

@ -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

View file

@ -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,

View file

@ -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;