diff --git a/src/deh_tables.c b/src/deh_tables.c index 323bf3bc0..59af77da5 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3998,6 +3998,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", @@ -5539,6 +5573,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_LAMPPOST", "MT_MOSSYTREE", + "MT_SYMBOL", + "MT_BUMP", "MT_FLINGENERGY", diff --git a/src/info.c b/src/info.c index 8a1f4e29e..99041f6af 100644 --- a/src/info.c +++ b/src/info.c @@ -644,6 +644,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 @@ -4639,6 +4673,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 @@ -26222,6 +26290,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_SYMBOL + 4094, // 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 diff --git a/src/info.h b/src/info.h index c52ec8541..7cd3cc354 100644 --- a/src/info.h +++ b/src/info.h @@ -1195,6 +1195,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 @@ -5092,6 +5126,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, @@ -6669,6 +6737,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 92477ca4d..e00b4813f 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -178,6 +178,11 @@ void Obj_BattleUFOBeamThink(mobj_t *beam); void Obj_SpawnPowerUpAura(player_t* player); void Obj_PowerUpAuraThink(mobj_t* mobj); +/* 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 0aa872933..ca07bc1eb 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -24,4 +24,5 @@ target_sources(SRB2SDL2 PRIVATE super-flicky.cpp battle-ufo.cpp powerup-aura.cpp + symbol.c ) diff --git a/src/objects/symbol.c b/src/objects/symbol.c new file mode 100644 index 000000000..155d18886 --- /dev/null +++ b/src/objects/symbol.c @@ -0,0 +1,43 @@ +#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 0c02af316..ae19e7844 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6712,6 +6712,9 @@ static void P_MobjSceneryThink(mobj_t *mobj) return; } break; + case MT_SYMBOL: + Obj_SymbolThink(mobj); + break; case MT_VWREF: case MT_VWREB: { @@ -10974,6 +10977,9 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_BATTLEUFO: Obj_SpawnBattleUFOLegs(mobj); break; + case MT_SYMBOL: + Obj_SymbolSpawn(mobj); + break; default: break; } @@ -13493,6 +13499,11 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj) Obj_LinkBattleUFOSpawner(mobj); break; } + case MT_SYMBOL: + { + Obj_SymbolSetup(mobj, mthing); + break; + } default: break; } diff --git a/src/p_setup.c b/src/p_setup.c index f6f587e1b..27b771df1 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -7202,6 +7202,14 @@ static void P_ConvertBinaryThingTypes(void) case CEILING_SLOPE_THING: mapthings[i].args[0] = mapthings[i].extrainfo; break; + case 4094: // MT_SYMBOL + mapthings[i].args[0] = mapthings[i].extrainfo; + if (mapthings[i].options & MTF_OBJECTSPECIAL) + { + // Special = add 16 to the symbol type + mapthings[i].args[0] += 16; + } + break; default: break; }