Merge branch 'ancient-gear-ii' into 'master'

Ancient Gear Tweaks

See merge request kart-krew-dev/ring-racers-internal!2727
This commit is contained in:
Oni VelocitOni 2025-08-11 23:46:38 +00:00
commit 5bb1cf3036
4 changed files with 77 additions and 7 deletions

View file

@ -22908,7 +22908,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
0, // mass 0, // mass
0, // damage 0, // damage
sfx_None, // activesound sfx_None, // activesound
MF_SPECIAL|MF_NOGRAVITY|MF_DONTENCOREMAP|MF_NOSQUISH, // flags MF_SPECIAL|MF_NOGRAVITY|MF_DONTENCOREMAP|MF_NOSQUISH|MF_DRAWFROMFARAWAY, // flags
S_NULL // raisestate S_NULL // raisestate
}, },
{ // MT_ANCIENTGEAR_PART { // MT_ANCIENTGEAR_PART
@ -22934,7 +22934,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
0, // mass 0, // mass
0, // damage 0, // damage
sfx_None, // activesound sfx_None, // activesound
MF_SCENERY|MF_NOGRAVITY|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_NOSQUISH, // flags MF_SCENERY|MF_NOGRAVITY|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP|MF_NOSQUISH|MF_DRAWFROMFARAWAY, // flags
S_NULL // raisestate S_NULL // raisestate
}, },
}; };

View file

@ -495,6 +495,8 @@ void Obj_AncientGearRemoved(mobj_t *gear);
void Obj_AncientGearTouch(mobj_t *gear, mobj_t *toucher); void Obj_AncientGearTouch(mobj_t *gear, mobj_t *toucher);
void Obj_AncientGearDeath(mobj_t *gear, mobj_t *source); void Obj_AncientGearDeath(mobj_t *gear, mobj_t *source);
void Obj_AncientGearDeadThink(mobj_t *gear); void Obj_AncientGearDeadThink(mobj_t *gear);
boolean Obj_AllowNextAncientGearSpawn(void);
void Obj_AncientGearSetup(mobj_t *gear, mapthing_t *mt);
void Obj_AncientGearLevelInit(void); void Obj_AncientGearLevelInit(void);
player_t *Obj_GetAncientGearCollectingPlayer(void); player_t *Obj_GetAncientGearCollectingPlayer(void);
boolean Obj_AllAncientGearsCollected(void); boolean Obj_AllAncientGearsCollected(void);

View file

@ -16,6 +16,7 @@
#include "../k_endcam.h" #include "../k_endcam.h"
#include "../k_hud.h" #include "../k_hud.h"
#include "../m_cond.h" #include "../m_cond.h"
#include "../g_game.h"
#define DEATH_FREEZE_TIME (5*TICRATE) #define DEATH_FREEZE_TIME (5*TICRATE)
#define DEATH_TIME (2*TICRATE) #define DEATH_TIME (2*TICRATE)
@ -29,7 +30,11 @@ static const fixed_t DELTA_SPRITEXSCALE = ((FRACUNIT/4 - FRACUNIT) / DEATH_TIME)
static const fixed_t DELTA_SPRITEYSCALE = ((FRACUNIT*3 - FRACUNIT) / DEATH_TIME); static const fixed_t DELTA_SPRITEYSCALE = ((FRACUNIT*3 - FRACUNIT) / DEATH_TIME);
static const tic_t TRANS_SHIFT_RATE = (DEATH_TIME / 10); static const tic_t TRANS_SHIFT_RATE = (DEATH_TIME / 10);
static UINT16 numGears = 0; #define MAX_GEARS 32
static UINT8 numGears = 0;
static UINT32 gearBank = 0;
static UINT8 gearBankIndex = 0;
static boolean allGearsCollected = false; static boolean allGearsCollected = false;
static player_t *collectingPlayer = NULL; static player_t *collectingPlayer = NULL;
@ -46,8 +51,6 @@ static void UpdateAncientGearPart(mobj_t *part)
gear->y + yOffset, gear->y + yOffset,
gear->z + gear->height / 2 gear->z + gear->height / 2
); );
part->angle += gear->extravalue1;
part->rollangle += gear->extravalue2 * part->extravalue1;
part->spritexscale = gear->spritexscale; part->spritexscale = gear->spritexscale;
part->spriteyscale = gear->spriteyscale; part->spriteyscale = gear->spriteyscale;
} }
@ -106,11 +109,14 @@ void Obj_AncientGearSpawn(mobj_t *gear)
void Obj_AncientGearPartThink(mobj_t *part) void Obj_AncientGearPartThink(mobj_t *part)
{ {
if (P_MobjWasRemoved(part->target)) mobj_t *gear = part->target;
if (P_MobjWasRemoved(gear))
{ {
P_RemoveMobj(part); P_RemoveMobj(part);
return; return;
} }
part->angle += gear->extravalue1;
part->rollangle += gear->extravalue2 * part->extravalue1;
UpdateAncientGearPart(part); UpdateAncientGearPart(part);
} }
@ -135,6 +141,12 @@ void Obj_AncientGearDeath(mobj_t *gear, mobj_t *source)
M_UpdateUnlockablesAndExtraEmblems(true, true); M_UpdateUnlockablesAndExtraEmblems(true, true);
} }
// if this gear has a bank account, mark it as collected so that it doesn't respawn upon retrying the map
if (gear->threshold != 0)
{
gearBank |= (1 << (gear->threshold - 1));
}
gear->fuse = DEATH_TIME; gear->fuse = DEATH_TIME;
gear->shadowscale = gear->spritexscale; gear->shadowscale = gear->spritexscale;
@ -219,10 +231,53 @@ void Obj_AncientGearDeadThink(mobj_t *gear)
gear->shadowscale = gear->spritexscale; gear->shadowscale = gear->spritexscale;
} }
boolean Obj_AllowNextAncientGearSpawn(void)
{
// always allow gears spawned by objectplace
if (objectplacing)
{
return true;
}
// don't allow the map to spawn more gears than we can bank
if (gearBankIndex >= MAX_GEARS)
{
CONS_Alert(CONS_WARNING, "Map exceeds maximum possible number of Ancient Gears (%d)!\n", MAX_GEARS);
return false;
}
// don't spawn a gear that was already collected prior to retrying
if (gearBank & (1 << gearBankIndex++))
{
return false;
}
return true;
}
void Obj_AncientGearSetup(mobj_t *gear, mapthing_t *mt)
{
mobj_t *part = gear;
while ((part = part->hnext))
{
UpdateAncientGearPart(part); // update part scales to apply mapthing scales
}
if (!objectplacing)
{
gear->threshold = gearBankIndex; // allocate this gear a bank account slot
}
}
void Obj_AncientGearLevelInit(void) void Obj_AncientGearLevelInit(void)
{ {
numGears = 0; if (!G_GetRetryFlag() || G_IsModeAttackRetrying())
{
gearBank = 0;
allGearsCollected = false; allGearsCollected = false;
}
gearBankIndex = 0;
numGears = 0;
collectingPlayer = NULL; collectingPlayer = NULL;
} }

View file

@ -11167,6 +11167,8 @@ fixed_t P_GetMobjDefaultScale(mobj_t *mobj)
return 2*FRACUNIT; return 2*FRACUNIT;
case MT_PULLUPHOOK: case MT_PULLUPHOOK:
return 2*FRACUNIT; return 2*FRACUNIT;
case MT_ANCIENTGEAR:
return 3*FRACUNIT/2;
default: default:
break; break;
} }
@ -13093,6 +13095,12 @@ static boolean P_AllowMobjSpawn(mapthing_t* mthing, mobjtype_t i)
break; break;
case MT_CHECKPOINT_END: case MT_CHECKPOINT_END:
break; break;
case MT_ANCIENTGEAR:
if (!Obj_AllowNextAncientGearSpawn())
{
return false;
}
break;
default: default:
break; break;
} }
@ -14543,6 +14551,11 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
Obj_TalkPointInit(mobj); Obj_TalkPointInit(mobj);
break; break;
} }
case MT_ANCIENTGEAR:
{
Obj_AncientGearSetup(mobj, mthing);
break;
}
default: default:
break; break;
} }