From 6dc7e96e9528efec045d9f2c58cc54562b928795 Mon Sep 17 00:00:00 2001 From: Lach Date: Mon, 19 Jun 2023 23:12:55 +1000 Subject: [PATCH] Add Lost Colony symbol object --- src/deh_tables.c | 42 ++++++++++++++-- src/info.c | 99 +++++++++++++++++++++++++++++++++++++- src/info.h | 70 +++++++++++++++++++++++++++ src/k_objects.h | 5 ++ src/objects/CMakeLists.txt | 1 + src/objects/symbol.c | 44 +++++++++++++++++ src/p_mobj.c | 15 +++++- 7 files changed, 269 insertions(+), 7 deletions(-) create mode 100644 src/objects/symbol.c diff --git a/src/deh_tables.c b/src/deh_tables.c index e44c6cb52..2bb6fb26e 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -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", @@ -5332,7 +5366,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_MONITOR_PART", "MT_MONITOR_SHARD", "MT_MAGICIANBOX", - + "MT_SLIPTIDEZIP", "MT_INSTAWHIP", @@ -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", @@ -5512,7 +5548,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_POWERCLASH", // Invinc/Grow no damage clash VFX "MT_GUARDBREAK", // Guard break - + "MT_PLAYERARROW", "MT_PLAYERWANTED", @@ -6135,7 +6171,7 @@ const char *COLOR_ENUMS[] = { "POSNUM_BEST4", "POSNUM_BEST5", "POSNUM_BEST6", - + "INTERMISSION", }; diff --git a/src/info.c b/src/info.c index cbe5556a3..0608ef9ce 100644 --- a/src/info.c +++ b/src/info.c @@ -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 @@ -22791,7 +22859,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, - + { // MT_SIGNSPARKLE -1, // doomednum S_SIGNSPARK1, // spawnstate @@ -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 @@ -29946,7 +30041,7 @@ skincolor_t skincolors[MAXSKINCOLORS] = { {"Position Best 4", {255, 255, 122, 122, 123, 123, 141, 141, 142, 142, 143, 143, 138, 139, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST4 {"Position Best 5", {152, 152, 153, 153, 154, 154, 155, 155, 156, 156, 157, 158, 159, 253, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST5 {"Position Best 6", {181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 29, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST6 - + {"Intermission", {0,80,80,81,81,81,84,85,86,87,246,248,251,26,28,31}, SKINCOLOR_NONE, 0, 0, false} // SKINCOLOR_INTERMISSION }; diff --git a/src/info.h b/src/info.h index 566e23eab..b0f51f256 100644 --- a/src/info.h +++ b/src/info.h @@ -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, diff --git a/src/k_objects.h b/src/k_objects.h index 3ea63b8ce..7b752347f 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -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 diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index 6ec83ac0c..b040ad1cc 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -21,4 +21,5 @@ target_sources(SRB2SDL2 PRIVATE block.c gachabom-rebound.cpp servant-hand.c + symbol.c ) diff --git a/src/objects/symbol.c b/src/objects/symbol.c new file mode 100644 index 000000000..fbd96fe7b --- /dev/null +++ b/src/objects/symbol.c @@ -0,0 +1,44 @@ +#include "../p_mobj.h" +#include "../p_local.h" +#include "../k_objects.h" + +#define SYMBOL_SCALE (2<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; +} diff --git a/src/p_mobj.c b/src/p_mobj.c index f28575cf7..0fb6777a7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -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: { @@ -8056,7 +8059,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) // cusval: responsible for disappear FX (should only happen once) // S_MAGICANBOX: sides, starting angle is set in the spawner (SetRandomFakePlayerSkin) - // S_MAGICIANBOX_TOP, S_MAGICIANBOX_BOTTOM: splats with their own offset sprite sets + // S_MAGICIANBOX_TOP, S_MAGICIANBOX_BOTTOM: splats with their own offset sprite sets mobj->extravalue2--; @@ -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; } @@ -12239,7 +12245,7 @@ static mobjtype_t P_GetMobjtypeSubstitute(mapthing_t *mthing, mobjtype_t i) if ((i == MT_RANDOMITEM) && (gametyperules & (GTR_PAPERITEMS|GTR_CIRCUIT)) == (GTR_PAPERITEMS|GTR_CIRCUIT)) return MT_PAPERITEMSPOT; - + return i; } @@ -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; }