Ancient Shrine polish

- Change the phrasing from "activate the ancient shrine" to "play a melody for the ancient shrine in"
- Add ~~Morbius~~ Mystic Melody Orb decorations
- A_FireShrink has been fixed to use mapobjectscale (and prevent dividing by 0)
This commit is contained in:
toaster 2023-10-14 21:25:03 +01:00
parent 52674c7bb2
commit 70c0b0503d
6 changed files with 104 additions and 15 deletions

View file

@ -1198,6 +1198,22 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
// Ancient Shrine // Ancient Shrine
"S_ANCIENTSHRINE", "S_ANCIENTSHRINE",
"S_MORB1",
"S_MORB2",
"S_MORB3",
"S_MORB4",
"S_MORB5",
"S_MORB6",
"S_MORB7",
"S_MORB8",
"S_MORB9",
"S_MORB10",
"S_MORB11",
"S_MORB12",
"S_MORB13",
"S_MORB14",
"S_MORB15",
// Chaos Emeralds // Chaos Emeralds
"S_CHAOSEMERALD1", "S_CHAOSEMERALD1",
"S_CHAOSEMERALD2", "S_CHAOSEMERALD2",

View file

@ -145,6 +145,7 @@ char sprnames[NUMSPRITES + 1][5] =
"EMBM", // Emblem "EMBM", // Emblem
"SPCN", // Spray Can "SPCN", // Spray Can
"MMSH", // Ancient Shrine "MMSH", // Ancient Shrine
"MORB", // One Morbillion
"EMRC", // Chaos Emeralds "EMRC", // Chaos Emeralds
"SEMR", // Super Emeralds "SEMR", // Super Emeralds
"ESPK", "ESPK",
@ -1902,6 +1903,22 @@ state_t states[NUMSTATES] =
// Ancient Shrine // Ancient Shrine
{SPR_MMSH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ANCIENTSHRINE {SPR_MMSH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ANCIENTSHRINE
{SPR_MORB, 0|FF_ADD, 1, {A_FireShrink}, 2*FRACUNIT/3, 12, S_MORB2}, // S_MORB1
{SPR_MORB, 1|FF_ADD, 1, {NULL}, 0, 0, S_MORB3}, // S_MORB2
{SPR_MORB, 2|FF_ADD, 1, {NULL}, 0, 0, S_MORB4}, // S_MORB3
{SPR_MORB, 3|FF_ADD, 1, {NULL}, 0, 0, S_MORB5}, // S_MORB4
{SPR_MORB, 4|FF_ADD, 1, {NULL}, 0, 0, S_MORB6}, // S_MORB5
{SPR_MORB, 5|FF_ADD, 1, {NULL}, 0, 0, S_MORB7}, // S_MORB6
{SPR_MORB, 6|FF_ADD, 1, {NULL}, 0, 0, S_MORB8}, // S_MORB7
{SPR_MORB, 7|FF_ADD, 4, {NULL}, 0, 0, S_MORB9}, // S_MORB8
{SPR_MORB, 6|FF_ADD, 1, {A_FireShrink}, 1, 12, S_MORB10}, // S_MORB9
{SPR_MORB, 5|FF_ADD, 1, {NULL}, 0, 0, S_MORB11}, // S_MORB10
{SPR_MORB, 4|FF_ADD, 1, {NULL}, 0, 0, S_MORB12}, // S_MORB11
{SPR_MORB, 3|FF_ADD, 1, {NULL}, 0, 0, S_MORB13}, // S_MORB12
{SPR_MORB, 2|FF_ADD, 1, {NULL}, 0, 0, S_MORB14}, // S_MORB13
{SPR_MORB, 1|FF_ADD, 1, {NULL}, 0, 0, S_MORB15}, // S_MORB14
{SPR_MORB, 0|FF_ADD, 1, {NULL}, 0, 0, S_NULL}, // S_MORB15
// Chaos Emeralds // Chaos Emeralds
{SPR_EMRC, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_CHAOSEMERALD2}, // S_CHAOSEMERALD1 {SPR_EMRC, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_CHAOSEMERALD2}, // S_CHAOSEMERALD1
{SPR_EMRC, FF_FULLBRIGHT|FF_ADD, 1, {NULL}, 0, 0, S_CHAOSEMERALD1}, // S_CHAOSEMERALD2 {SPR_EMRC, FF_FULLBRIGHT|FF_ADD, 1, {NULL}, 0, 0, S_CHAOSEMERALD1}, // S_CHAOSEMERALD2
@ -1923,7 +1940,7 @@ state_t states[NUMSTATES] =
{SPR_LENS, FF_FULLBRIGHT|FF_ADD|FF_TRANS10|FF_ANIMATE|11, 8, {NULL}, 7, 1, S_GAINAX_MID2}, // S_EMERALDFLARE1 {SPR_LENS, FF_FULLBRIGHT|FF_ADD|FF_TRANS10|FF_ANIMATE|11, 8, {NULL}, 7, 1, S_GAINAX_MID2}, // S_EMERALDFLARE1
// Prison Egg Drops // Prison Egg Drops
{SPR_ALTM, 0|FF_PAPERSPRITE, -1, {NULL}, 0, 0, S_NULL}, // S_PRISONEGGDROP_CD {SPR_ALTM, 0|FF_PAPERSPRITE|FF_SEMIBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PRISONEGGDROP_CD
// Bubble Source // Bubble Source
{SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1 {SPR_BBLS, 0, 8, {A_BubbleSpawn}, 2048, 0, S_BUBBLES2}, // S_BUBBLES1

View file

@ -700,6 +700,7 @@ typedef enum sprite
SPR_EMBM, // Emblem SPR_EMBM, // Emblem
SPR_SPCN, // Spray Can SPR_SPCN, // Spray Can
SPR_MMSH, // Ancient Shrine SPR_MMSH, // Ancient Shrine
SPR_MORB, // One Morbillion
SPR_EMRC, // Chaos Emeralds SPR_EMRC, // Chaos Emeralds
SPR_SEMR, // Super Emeralds SPR_SEMR, // Super Emeralds
SPR_ESPK, SPR_ESPK,
@ -2382,6 +2383,22 @@ typedef enum state
// Ancient Shrine // Ancient Shrine
S_ANCIENTSHRINE, S_ANCIENTSHRINE,
S_MORB1,
S_MORB2,
S_MORB3,
S_MORB4,
S_MORB5,
S_MORB6,
S_MORB7,
S_MORB8,
S_MORB9,
S_MORB10,
S_MORB11,
S_MORB12,
S_MORB13,
S_MORB14,
S_MORB15,
// Chaos Emeralds // Chaos Emeralds
S_CHAOSEMERALD1, S_CHAOSEMERALD1,
S_CHAOSEMERALD2, S_CHAOSEMERALD2,

View file

@ -1827,7 +1827,7 @@ static const char *M_GetConditionString(condition_t *cn)
else if (cn->type == UC_MAPSPBATTACK) else if (cn->type == UC_MAPSPBATTACK)
work = "conquer"; work = "conquer";
else if (cn->type == UC_MAPMYSTICMELODY) else if (cn->type == UC_MAPMYSTICMELODY)
work = "activate the ancient shrine in"; work = "play a melody for the ancient shrine in";
work = va("%s%s %s", work = va("%s%s %s",
prefix, prefix,

View file

@ -12652,11 +12652,11 @@ void A_FireShrink(mobj_t *actor)
INT32 locvar1 = var1; INT32 locvar1 = var1;
INT32 locvar2 = var2; INT32 locvar2 = var2;
if (LUA_CallAction(A_FIRESHRINK, actor)) if (LUA_CallAction(A_FIRESHRINK, actor) || locvar2 == 0)
return; return;
actor->destscale = locvar1; actor->destscale = locvar1;
actor->scalespeed = FRACUNIT/locvar2; actor->scalespeed = mapobjectscale/locvar2;
} }
// Function: A_SpawnPterabytes // Function: A_SpawnPterabytes

View file

@ -7257,16 +7257,55 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
} }
case MT_ANCIENTSHRINE: case MT_ANCIENTSHRINE:
{ {
if (P_MobjWasRemoved(mobj->tracer) == false boolean docolorized = false;
&& mobj->tracer->fuse == 1)
{
if (!(mapheaderinfo[gamemap-1]->records.mapvisited & MV_MYSTICMELODY))
{
mapheaderinfo[gamemap-1]->records.mapvisited |= MV_MYSTICMELODY;
if (!M_UpdateUnlockablesAndExtraEmblems(true, true)) if (P_MobjWasRemoved(mobj->tracer) == false)
S_StartSound(NULL, sfx_ncitem); {
gamedata->deferredsave = true; if (mobj->tracer->fuse == 1)
{
if (!(mapheaderinfo[gamemap-1]->records.mapvisited & MV_MYSTICMELODY))
{
mapheaderinfo[gamemap-1]->records.mapvisited |= MV_MYSTICMELODY;
if (!M_UpdateUnlockablesAndExtraEmblems(true, true))
S_StartSound(NULL, sfx_ncitem);
gamedata->deferredsave = true;
}
}
// Non-RNG-advancing equivalent of Obj_SpawnEmeraldSparks
if (leveltime % 3 == 0)
{
mobj_t *sparkle = P_SpawnMobjFromMobj(
mobj,
M_RandomRange(-48, 48) * FRACUNIT,
M_RandomRange(-48, 48) * FRACUNIT,
M_RandomRange(0, 64) * FRACUNIT,
MT_SPARK
);
P_SetMobjState(sparkle, S_MORB1);
sparkle->color = SKINCOLOR_PLAGUE;
sparkle->momz += 6 * mobj->scale * P_MobjFlip(mobj);
P_SetScale(sparkle, 2);
}
docolorized = !!(leveltime & 1);
}
if (mobj->colorized != docolorized)
{
if (docolorized)
{
mobj->colorized = true;
mobj->color = SKINCOLOR_PLAGUE;
mobj->spriteyoffset = 1;
}
else
{
mobj->colorized = false;
mobj->color = SKINCOLOR_NONE;
mobj->spriteyoffset = 0;
} }
} }
@ -7678,7 +7717,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
mobj->renderflags |= RF_SEMIBRIGHT; mobj->renderflags |= RF_SEMIBRIGHT;
} }
P_SetMobjState(mobj, teststate); P_SetMobjStateNF(mobj, teststate);
if (P_MobjWasRemoved(mobj)) if (P_MobjWasRemoved(mobj))
{ {
@ -7724,7 +7763,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
M_RandomRange(0, 64) * FRACUNIT, M_RandomRange(0, 64) * FRACUNIT,
MT_SPARK MT_SPARK
); );
P_SetMobjState(sparkle, mobjinfo[MT_EMERALDSPARK].spawnstate); P_SetMobjStateNF(sparkle, mobjinfo[MT_EMERALDSPARK].spawnstate);
sparkle->color = M_RandomChance(FRACUNIT/2) ? SKINCOLOR_ULTRAMARINE : SKINCOLOR_MAGENTA; sparkle->color = M_RandomChance(FRACUNIT/2) ? SKINCOLOR_ULTRAMARINE : SKINCOLOR_MAGENTA;
sparkle->momz += 8 * mobj->scale * P_MobjFlip(mobj); sparkle->momz += 8 * mobj->scale * P_MobjFlip(mobj);