Add Lost Colony symbol object

This commit is contained in:
Lach 2023-06-19 23:12:55 +10:00
parent abd6e183e9
commit 6dc7e96e95
7 changed files with 269 additions and 7 deletions

View file

@ -3981,6 +3981,40 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_LAMPPOST",
"S_MOSSYTREE",
// Lost Colony symbol signs
"S_SYMBOL_0",
"S_SYMBOL_1",
"S_SYMBOL_2",
"S_SYMBOL_3",
"S_SYMBOL_4",
"S_SYMBOL_5",
"S_SYMBOL_6",
"S_SYMBOL_7",
"S_SYMBOL_8",
"S_SYMBOL_9",
"S_SYMBOL_A",
"S_SYMBOL_B",
"S_SYMBOL_C",
"S_SYMBOL_D",
"S_SYMBOL_E",
"S_SYMBOL_F",
"S_SYMBOL_G",
"S_SYMBOL_H",
"S_SYMBOL_I",
"S_SYMBOL_J",
"S_SYMBOL_K",
"S_SYMBOL_L",
"S_SYMBOL_M",
"S_SYMBOL_N",
"S_SYMBOL_O",
"S_SYMBOL_P",
"S_SYMBOL_Q",
"S_SYMBOL_R",
"S_SYMBOL_S",
"S_SYMBOL_T",
"S_SYMBOL_U",
"S_SYMBOL_V",
"S_BUMP1",
"S_BUMP2",
"S_BUMP3",
@ -5499,6 +5533,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_LAMPPOST",
"MT_MOSSYTREE",
"MT_SYMBOL",
"MT_BUMP",
"MT_FLINGENERGY",

View file

@ -632,6 +632,40 @@ char sprnames[NUMSPRITES + 1][5] =
"CRAB", // Crystal Abyss mobs
"BRNG", // Chaotix Big Ring
// Lost Colony symbol signs
"SYM0",
"SYM1",
"SYM2",
"SYM3",
"SYM4",
"SYM5",
"SYM6",
"SYM7",
"SYM8",
"SYM9",
"SYMA",
"SYMB",
"SYMC",
"SYMD",
"SYME",
"SYMF",
"SYMG",
"SYMH",
"SYMI",
"SYMJ",
"SYMK",
"SYML",
"SYMM",
"SYMN",
"SYMO",
"SYMP",
"SYMQ",
"SYMR",
"SYMS",
"SYMT",
"SYMU",
"SYMV",
"BUMP", // Player/shell bump
"FLEN", // Shell hit graphics stuff
"CLAS", // items clash
@ -4604,6 +4638,40 @@ state_t states[NUMSTATES] =
{SPR_CRAB, 10, -1, {NULL}, 0, 0, S_NULL}, // S_LAMPPOST
{SPR_CRAB, 11, -1, {NULL}, 0, 0, S_NULL}, // S_MOSSYTREE
// Lost Colony symbol signs
{SPR_SYM0, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_0
{SPR_SYM1, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_1
{SPR_SYM2, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_2
{SPR_SYM3, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_3
{SPR_SYM4, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_4
{SPR_SYM5, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_5
{SPR_SYM6, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_6
{SPR_SYM7, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_7
{SPR_SYM8, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_8
{SPR_SYM9, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_9
{SPR_SYMA, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_A
{SPR_SYMB, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_B
{SPR_SYMC, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_C
{SPR_SYMD, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_D
{SPR_SYME, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_E
{SPR_SYMF, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_F
{SPR_SYMG, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_G
{SPR_SYMH, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_H
{SPR_SYMI, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_I
{SPR_SYMJ, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_J
{SPR_SYMK, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_K
{SPR_SYML, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_L
{SPR_SYMM, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_M
{SPR_SYMN, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_N
{SPR_SYMO, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_O
{SPR_SYMP, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_P
{SPR_SYMQ, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_Q
{SPR_SYMR, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_R
{SPR_SYMS, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_S
{SPR_SYMT, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_T
{SPR_SYMU, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_U
{SPR_SYMV, FF_ANIMATE|FF_PAPERSPRITE, -1, {NULL}, 15, 2, S_NULL}, // S_SYMBOL_V
{SPR_BUMP, FF_FULLBRIGHT, 3, {NULL}, 0, 0, S_BUMP2}, // S_BUMP1
{SPR_BUMP, FF_FULLBRIGHT|1, 3, {NULL}, 0, 0, S_BUMP3}, // S_BUMP2
{SPR_BUMP, FF_FULLBRIGHT|2, 3, {NULL}, 0, 0, S_NULL}, // S_BUMP3
@ -26086,6 +26154,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
S_NULL // raisestate
},
{ // MT_SYMBOL
-1, // doomednum
S_SYMBOL_0, // spawnstate
1000, // spawnhealth
S_NULL, // seestate
sfx_None, // seesound
8, // 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
43*FRACUNIT, // radius
100*FRACUNIT, // height
0, // display offset
100, // mass
0, // damage
sfx_None, // activesound
MF_NOGRAVITY|MF_SCENERY|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags
S_NULL // raisestate
},
{ // MT_BUMP
-1, // doomednum
S_BUMP1, // spawnstate

View file

@ -1185,6 +1185,40 @@ typedef enum sprite
SPR_CRAB, // Crystal Abyss mobs
SPR_BRNG, // Chaotix Big Ring
// Lost Colony symbol signs
SPR_SYM0,
SPR_SYM1,
SPR_SYM2,
SPR_SYM3,
SPR_SYM4,
SPR_SYM5,
SPR_SYM6,
SPR_SYM7,
SPR_SYM8,
SPR_SYM9,
SPR_SYMA,
SPR_SYMB,
SPR_SYMC,
SPR_SYMD,
SPR_SYME,
SPR_SYMF,
SPR_SYMG,
SPR_SYMH,
SPR_SYMI,
SPR_SYMJ,
SPR_SYMK,
SPR_SYML,
SPR_SYMM,
SPR_SYMN,
SPR_SYMO,
SPR_SYMP,
SPR_SYMQ,
SPR_SYMR,
SPR_SYMS,
SPR_SYMT,
SPR_SYMU,
SPR_SYMV,
SPR_BUMP, // Player/shell bump
SPR_FLEN, // Shell hit graphics stuff
SPR_CLAS, // items clash
@ -5058,6 +5092,40 @@ typedef enum state
S_LAMPPOST,
S_MOSSYTREE,
// Lost Colony symbol signs
S_SYMBOL_0,
S_SYMBOL_1,
S_SYMBOL_2,
S_SYMBOL_3,
S_SYMBOL_4,
S_SYMBOL_5,
S_SYMBOL_6,
S_SYMBOL_7,
S_SYMBOL_8,
S_SYMBOL_9,
S_SYMBOL_A,
S_SYMBOL_B,
S_SYMBOL_C,
S_SYMBOL_D,
S_SYMBOL_E,
S_SYMBOL_F,
S_SYMBOL_G,
S_SYMBOL_H,
S_SYMBOL_I,
S_SYMBOL_J,
S_SYMBOL_K,
S_SYMBOL_L,
S_SYMBOL_M,
S_SYMBOL_N,
S_SYMBOL_O,
S_SYMBOL_P,
S_SYMBOL_Q,
S_SYMBOL_R,
S_SYMBOL_S,
S_SYMBOL_T,
S_SYMBOL_U,
S_SYMBOL_V,
S_BUMP1,
S_BUMP2,
S_BUMP3,
@ -6612,6 +6680,8 @@ typedef enum mobj_type
MT_LAMPPOST,
MT_MOSSYTREE,
MT_SYMBOL, // Lost Colony symbol signs
MT_BUMP,
MT_FLINGENERGY,

View file

@ -140,6 +140,11 @@ void Obj_SpawnGachaBomRebound(mobj_t *source, mobj_t *target);
/* Servant Hand */
void Obj_ServantHandHandling(player_t *player);
/* Lost Colony symbol signs */
void Obj_SymbolSpawn(mobj_t *mobj);
void Obj_SymbolSetup(mobj_t *mobj, mapthing_t *mthing);
void Obj_SymbolThink(mobj_t *mobj);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -21,4 +21,5 @@ target_sources(SRB2SDL2 PRIVATE
block.c
gachabom-rebound.cpp
servant-hand.c
symbol.c
)

44
src/objects/symbol.c Normal file
View file

@ -0,0 +1,44 @@
#include "../p_mobj.h"
#include "../p_local.h"
#include "../k_objects.h"
#define SYMBOL_SCALE (2<<FRACBITS)
#define SYMBOL_ZOFFSET (19<<FRACBITS)
#define SYMBOL_BOBRANGE (64<<FRACBITS)
#define SYMBOL_BOBSPEED (5<<FRACBITS)
#define SYMBOL_OPTIONS 32
void Obj_SymbolSpawn(mobj_t *mobj)
{
mobj->extravalue1 = mobj->z;
mobj->extravalue2 = FixedMul(mobj->x + mobj->y, mapobjectscale);
}
void Obj_SymbolSetup(mobj_t *mobj, mapthing_t *mthing)
{
fixed_t oldHeight = mobj->height;
statenum_t stateNum = mobj->info->spawnstate + (mthing->args[0] % SYMBOL_OPTIONS);
mobj->angle += ANGLE_90;
P_SetScale(mobj, mobj->destscale = 4 * FixedMul(mobj->scale, SYMBOL_SCALE));
mobj->z += 4 * FixedMul(mapobjectscale, SYMBOL_ZOFFSET) * P_MobjFlip(mobj);
if (mthing->options & MTF_OBJECTFLIP)
{
mobj->z += oldHeight - mobj->height;
}
mobj->extravalue1 = mobj->old_z = mobj->z;
P_SetMobjState(mobj, stateNum);
}
void Obj_SymbolThink(mobj_t *mobj)
{
fixed_t offset = FixedMul(mapobjectscale,
FixedMul(SYMBOL_BOBRANGE,
FixedMul(FINESINE(FixedAngle(leveltime * SYMBOL_BOBSPEED + mobj->extravalue2) >> ANGLETOFINESHIFT) + FRACUNIT, FRACUNIT >> 1)
)
);
mobj->z = mobj->extravalue1 + P_MobjFlip(mobj) * offset;
}

View file

@ -6681,6 +6681,9 @@ static void P_MobjSceneryThink(mobj_t *mobj)
return;
}
break;
case MT_SYMBOL:
Obj_SymbolThink(mobj);
break;
case MT_VWREF:
case MT_VWREB:
{
@ -10911,6 +10914,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
case MT_SPHEREBOX:
Obj_RandomItemSpawn(mobj);
break;
case MT_SYMBOL:
Obj_SymbolSpawn(mobj);
break;
default:
break;
}
@ -13395,6 +13401,11 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
Obj_InitLoopCenter(mobj);
break;
}
case MT_SYMBOL:
{
Obj_SymbolSetup(mobj, mthing);
break;
}
default:
break;
}