mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Merge branch 'dashrings' into 'master'
Hardcode MT_DASHRING & MT_RAINBOWDASHRING See merge request KartKrew/Kart!1345
This commit is contained in:
commit
e9cea99ae7
19 changed files with 756 additions and 31 deletions
|
|
@ -129,6 +129,7 @@ typedef enum
|
|||
// Specific level gimmicks.
|
||||
CR_SLIDING,
|
||||
CR_ZOOMTUBE,
|
||||
CR_DASHRING,
|
||||
} carrytype_t; // carry
|
||||
|
||||
/*
|
||||
|
|
@ -691,6 +692,9 @@ struct player_t
|
|||
UINT8 trickboostdecay; // used to know how long you've waited
|
||||
UINT8 trickboost; // Trick boost. This one is weird and has variable speed. Dear god.
|
||||
|
||||
UINT8 dashRingPullTics; // Timer during which the player is pulled towards a dash ring
|
||||
UINT8 dashRingPushTics; // Timer during which the player displays effects and has no gravity after being thrust by a dash ring
|
||||
|
||||
tic_t ebrakefor; // Ebrake timer, used for visuals.
|
||||
|
||||
UINT16 faultflash; // Used for misc FAULT visuals
|
||||
|
|
@ -804,7 +808,7 @@ struct player_t
|
|||
|
||||
UINT8 ringboxdelay; // Delay until Ring Box auto-activates
|
||||
UINT8 ringboxaward; // Where did we stop?
|
||||
|
||||
|
||||
fixed_t outrun; // Milky Way road effect
|
||||
|
||||
uint8_t public_key[PUBKEYLENGTH];
|
||||
|
|
|
|||
|
|
@ -301,6 +301,7 @@ actionpointer_t actionpointers[] =
|
|||
{{A_InvincSparkleRotate}, "A_INVINCSPARKLEROTATE"},
|
||||
{{A_SpawnItemDebrisCloud}, "A_SPAWNITEMDEBRISCLOUD"},
|
||||
{{A_RingShooterFace}, "A_RINGSHOOTERFACE"},
|
||||
{{A_SpawnSneakerPanel}, "A_SPAWNSNEAKERPANEL"},
|
||||
|
||||
{{NULL}, "NONE"},
|
||||
|
||||
|
|
@ -4236,6 +4237,26 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
|
|||
"S_FZSLOWSMOKE4",
|
||||
"S_FZSLOWSMOKE5",
|
||||
|
||||
// Dash Rings
|
||||
"S_DASHRING_HORIZONTAL",
|
||||
"S_DASHRING_30DEGREES",
|
||||
"S_DASHRING_60DEGREES",
|
||||
"S_DASHRING_VERTICAL",
|
||||
"S_DASHRING_HORIZONTAL_FLASH1",
|
||||
"S_DASHRING_HORIZONTAL_FLASH2",
|
||||
"S_DASHRING_30DEGREES_FLASH1",
|
||||
"S_DASHRING_30DEGREES_FLASH2",
|
||||
"S_DASHRING_60DEGREES_FLASH1",
|
||||
"S_DASHRING_60DEGREES_FLASH2",
|
||||
"S_DASHRING_VERTICAL_FLASH1",
|
||||
"S_DASHRING_VERTICAL_FLASH2",
|
||||
|
||||
// Sneaker Panels
|
||||
"S_SNEAKERPANEL",
|
||||
"S_SNEAKERPANEL_SMALL",
|
||||
"S_SNEAKERPANEL_TINY",
|
||||
"S_SNEAKERPANELSPAWNER",
|
||||
|
||||
// Various plants
|
||||
"S_SONICBUSH",
|
||||
|
||||
|
|
@ -5606,6 +5627,14 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
|
|||
|
||||
"MT_FZEROBOOM",
|
||||
|
||||
// Dash Rings
|
||||
"MT_DASHRING",
|
||||
"MT_RAINBOWDASHRING",
|
||||
|
||||
// Sneaker Panels
|
||||
"MT_SNEAKERPANEL",
|
||||
"MT_SNEAKERPANELSPAWNER",
|
||||
|
||||
// Various plants
|
||||
"MT_SONICBUSH",
|
||||
|
||||
|
|
|
|||
136
src/info.c
136
src/info.c
|
|
@ -717,6 +717,14 @@ char sprnames[NUMSPRITES + 1][5] =
|
|||
"FZSM", // F-Zero NO CONTEST explosion
|
||||
"FZBM",
|
||||
|
||||
// Dash Rings
|
||||
"RAIR",
|
||||
|
||||
// Sneaker Panels
|
||||
"BSTP",
|
||||
"BSTS",
|
||||
"BSTT",
|
||||
|
||||
// Various plants
|
||||
"SBUS",
|
||||
|
||||
|
|
@ -4921,6 +4929,26 @@ state_t states[NUMSTATES] =
|
|||
{SPR_SMOK, 3, 30, {NULL}, 0, 0, S_FZSLOWSMOKE5}, // S_FZSLOWSMOKE4
|
||||
{SPR_SMOK, 4, 30, {NULL}, 0, 0, S_NULL}, // S_FZSLOWSMOKE5
|
||||
|
||||
// Dash Rings
|
||||
{SPR_RAIR, 0, -1, {NULL}, 0, 0, S_NULL}, // S_DASHRING_HORIZONTAL
|
||||
{SPR_RAIR, 1, -1, {NULL}, 0, 0, S_NULL}, // S_DASHRING_30DEGREES
|
||||
{SPR_RAIR, 2, -1, {NULL}, 0, 0, S_NULL}, // S_DASHRING_60DEGREES
|
||||
{SPR_RAIR, 3, -1, {NULL}, 0, 0, S_NULL}, // S_DASHRING_VERTICAL
|
||||
{SPR_NULL, 0, TICRATE/3 - 2, {NULL}, 0, 0, S_DASHRING_HORIZONTAL_FLASH2}, // S_DASHRING_HORIZONTAL_FLASH1
|
||||
{SPR_RAIR, FF_ADD|0, 2, {NULL}, 0, 0, S_DASHRING_HORIZONTAL_FLASH1}, // S_DASHRING_HORIZONTAL_FLASH2
|
||||
{SPR_NULL, 0, TICRATE/3 - 2, {NULL}, 0, 0, S_DASHRING_30DEGREES_FLASH2}, // S_DASHRING_30DEGREES_FLASH1
|
||||
{SPR_RAIR, FF_ADD|1, 2, {NULL}, 0, 0, S_DASHRING_30DEGREES_FLASH1}, // S_DASHRING_30DEGREES_FLASH2
|
||||
{SPR_NULL, 0, TICRATE/3 - 2, {NULL}, 0, 0, S_DASHRING_60DEGREES_FLASH2}, // S_DASHRING_60DEGREES_FLASH1
|
||||
{SPR_RAIR, FF_ADD|2, 2, {NULL}, 0, 0, S_DASHRING_60DEGREES_FLASH1}, // S_DASHRING_60DEGREES_FLASH2
|
||||
{SPR_NULL, 0, TICRATE/3 - 2, {NULL}, 0, 0, S_DASHRING_VERTICAL_FLASH2}, // S_DASHRING_VERTICAL_FLASH1
|
||||
{SPR_RAIR, FF_ADD|3, 2, {NULL}, 0, 0, S_DASHRING_VERTICAL_FLASH1}, // S_DASHRING_VERTICAL_FLASH2
|
||||
|
||||
// Sneaker Panels
|
||||
{SPR_BSTP, FF_ANIMATE|FF_GLOBALANIM|FF_FLOORSPRITE|FF_FULLBRIGHT, -1, {NULL}, 5, 2, S_SNEAKERPANEL}, // S_SNEAKERPANEL
|
||||
{SPR_BSTS, FF_ANIMATE|FF_GLOBALANIM|FF_FLOORSPRITE|FF_FULLBRIGHT, -1, {NULL}, 5, 2, S_SNEAKERPANEL_SMALL}, // S_SNEAKERPANEL_SMALL
|
||||
{SPR_BSTT, FF_ANIMATE|FF_GLOBALANIM|FF_FLOORSPRITE|FF_FULLBRIGHT, -1, {NULL}, 5, 2, S_SNEAKERPANEL_TINY}, // S_SNEAKERPANEL_TINY
|
||||
{SPR_NULL, 0, 65, {A_SpawnSneakerPanel}, 0, 0, S_SNEAKERPANELSPAWNER}, // S_SNEAKERPANELSPAWNER
|
||||
|
||||
// Various plants
|
||||
{SPR_SBUS, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SONICBUSH
|
||||
|
||||
|
|
@ -26732,6 +26760,114 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] =
|
|||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_DASHRING
|
||||
3441, // doomednum
|
||||
S_DASHRING_HORIZONTAL, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_dashr, // 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
|
||||
112*FRACUNIT, // radius
|
||||
192*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_SPECIAL, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_RAINBOWDASHRING
|
||||
3442, // doomednum
|
||||
S_DASHRING_HORIZONTAL, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_rainbr, // 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
|
||||
112*FRACUNIT, // radius
|
||||
192*FRACUNIT, // height
|
||||
0, // display offset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_SPECIAL, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SNEAKERPANEL
|
||||
510, // doomednum
|
||||
S_SNEAKERPANEL, // spawnstate
|
||||
1000, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // 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
|
||||
91*FRACUNIT, // radius
|
||||
16*FRACUNIT, // height
|
||||
0, // dispoffset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_SPECIAL|MF_ENEMY, // flags -- NOTE: IIRC MF_ENEMY was added by mappers to make conveyor belt setups more convenient
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SNEAKERPANELSPAWNER
|
||||
511, // doomednum
|
||||
S_SNEAKERPANELSPAWNER, // spawnstate
|
||||
0, // spawnhealth
|
||||
S_NULL, // seestate
|
||||
sfx_None, // seesound
|
||||
0, // 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
|
||||
32*FRACUNIT, // radius
|
||||
60*FRACUNIT, // height
|
||||
0, // dispoffset
|
||||
0, // mass
|
||||
0, // damage
|
||||
sfx_None, // activesound
|
||||
MF_NOGRAVITY|MF_NOBLOCKMAP|MF_SCENERY|MF_NOCLIPTHING, // flags
|
||||
S_NULL // raisestate
|
||||
},
|
||||
|
||||
{ // MT_SONICBUSH,
|
||||
715, // doomednum
|
||||
S_SONICBUSH, // spawnstate
|
||||
|
|
|
|||
38
src/info.h
38
src/info.h
|
|
@ -294,6 +294,7 @@ enum actionnum
|
|||
A_INVINCSPARKLEROTATE,
|
||||
A_SPAWNITEMDEBRISCLOUD,
|
||||
A_RINGSHOOTERFACE,
|
||||
A_SPAWNSNEAKERPANEL,
|
||||
NUMACTIONS
|
||||
};
|
||||
|
||||
|
|
@ -568,6 +569,7 @@ void A_FlameShieldPaper();
|
|||
void A_InvincSparkleRotate();
|
||||
void A_SpawnItemDebrisCloud();
|
||||
void A_RingShooterFace();
|
||||
void A_SpawnSneakerPanel();
|
||||
|
||||
extern boolean actionsoverridden[NUMACTIONS];
|
||||
|
||||
|
|
@ -1268,6 +1270,14 @@ typedef enum sprite
|
|||
SPR_FZSM, // F-Zero NO CONTEST explosion
|
||||
SPR_FZBM,
|
||||
|
||||
// Dash Rings
|
||||
SPR_RAIR,
|
||||
|
||||
// Sneaker Panels
|
||||
SPR_BSTP,
|
||||
SPR_BSTS,
|
||||
SPR_BSTT,
|
||||
|
||||
// Various plants
|
||||
SPR_SBUS,
|
||||
|
||||
|
|
@ -5369,6 +5379,26 @@ typedef enum state
|
|||
S_FZSLOWSMOKE4,
|
||||
S_FZSLOWSMOKE5,
|
||||
|
||||
// Dash Rings
|
||||
S_DASHRING_HORIZONTAL,
|
||||
S_DASHRING_30DEGREES,
|
||||
S_DASHRING_60DEGREES,
|
||||
S_DASHRING_VERTICAL,
|
||||
S_DASHRING_HORIZONTAL_FLASH1,
|
||||
S_DASHRING_HORIZONTAL_FLASH2,
|
||||
S_DASHRING_30DEGREES_FLASH1,
|
||||
S_DASHRING_30DEGREES_FLASH2,
|
||||
S_DASHRING_60DEGREES_FLASH1,
|
||||
S_DASHRING_60DEGREES_FLASH2,
|
||||
S_DASHRING_VERTICAL_FLASH1,
|
||||
S_DASHRING_VERTICAL_FLASH2,
|
||||
|
||||
// Sneaker Panels
|
||||
S_SNEAKERPANEL,
|
||||
S_SNEAKERPANEL_SMALL,
|
||||
S_SNEAKERPANEL_TINY,
|
||||
S_SNEAKERPANELSPAWNER,
|
||||
|
||||
// Various plants
|
||||
S_SONICBUSH,
|
||||
|
||||
|
|
@ -6774,6 +6804,14 @@ typedef enum mobj_type
|
|||
|
||||
MT_FZEROBOOM,
|
||||
|
||||
// Dash Rings
|
||||
MT_DASHRING,
|
||||
MT_RAINBOWDASHRING,
|
||||
|
||||
// Sneaker Panels
|
||||
MT_SNEAKERPANEL,
|
||||
MT_SNEAKERPANELSPAWNER,
|
||||
|
||||
// Various plants
|
||||
MT_SONICBUSH,
|
||||
|
||||
|
|
|
|||
34
src/k_kart.c
34
src/k_kart.c
|
|
@ -2027,7 +2027,7 @@ void K_SpawnMagicianParticles(mobj_t *mo, int spread)
|
|||
{
|
||||
fixed_t hmomentum = P_RandomRange(PR_DECORATION, spread * -1, spread) * mo->scale;
|
||||
fixed_t vmomentum = P_RandomRange(PR_DECORATION, spread * -1, spread) * mo->scale;
|
||||
UINT16 color = P_RandomKey(PR_DECORATION, numskincolors);
|
||||
UINT16 color = P_RandomKey(PR_DECORATION, numskincolors);
|
||||
|
||||
fixed_t ang = FixedAngle(P_RandomRange(PR_DECORATION, 0, 359)*FRACUNIT);
|
||||
SINT8 flip = 1;
|
||||
|
|
@ -2679,7 +2679,7 @@ void K_TryHurtSoundExchange(mobj_t *victim, mobj_t *attacker)
|
|||
return;
|
||||
}
|
||||
|
||||
// In a perfect world we could move this here, but there's
|
||||
// In a perfect world we could move this here, but there's
|
||||
// a few niche situations where we want a pain sound from
|
||||
// the victim, but no confirm sound from the attacker.
|
||||
// (ex: DMG_STING)
|
||||
|
|
@ -4148,7 +4148,7 @@ static boolean K_IsLosingSliptideZip(player_t *player)
|
|||
return true;
|
||||
if (!K_Sliptiding(player) && player->sliptideZip < MIN_WAVEDASH_CHARGE)
|
||||
return true;
|
||||
if (!K_Sliptiding(player) && player->drift == 0
|
||||
if (!K_Sliptiding(player) && player->drift == 0
|
||||
&& P_IsObjectOnGround(player->mo) && player->sneakertimer == 0
|
||||
&& player->driftboost == 0)
|
||||
return true;
|
||||
|
|
@ -4211,7 +4211,7 @@ void K_UpdateSliptideZipIndicator(player_t *player)
|
|||
if (leveltime % 2 == 0)
|
||||
mobj->renderflags |= RF_TRANS50;
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
// Storing boost
|
||||
mobj->rollangle += 3*ANG15/4;
|
||||
|
|
@ -4357,7 +4357,7 @@ INT32 K_ExplodePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) // A
|
|||
{
|
||||
if (inflictor->type == MT_SPBEXPLOSION && inflictor->movefactor)
|
||||
{
|
||||
if (modeattacking & ATTACKING_SPB)
|
||||
if (modeattacking & ATTACKING_SPB)
|
||||
{
|
||||
P_DamageMobj(player->mo, inflictor, source, 1, DMG_INSTAKILL);
|
||||
player->SPBdistance = 0;
|
||||
|
|
@ -4676,7 +4676,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I
|
|||
speed,
|
||||
FixedMul(
|
||||
FixedDiv(source->player->speed, topspeed),
|
||||
deltaFactor
|
||||
deltaFactor
|
||||
)
|
||||
));
|
||||
}
|
||||
|
|
@ -7747,6 +7747,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd)
|
|||
K_UpdateDraft(player);
|
||||
K_UpdateEngineSounds(player); // Thanks, VAda!
|
||||
|
||||
Obj_DashRingPlayerThink(player);
|
||||
|
||||
// update boost angle if not spun out
|
||||
if (!player->spinouttimer && !player->wipeoutslow)
|
||||
player->boostangle = player->mo->angle;
|
||||
|
|
@ -8940,7 +8942,7 @@ void K_UpdateDistanceFromFinishLine(player_t *const player)
|
|||
|
||||
bestPoint = pDist;
|
||||
|
||||
bestDist =
|
||||
bestDist =
|
||||
P_AproxDistance(
|
||||
(result.x >> FRACBITS) - (line[0].x >> FRACBITS),
|
||||
(result.y >> FRACBITS) - (line[0].y >> FRACBITS));
|
||||
|
|
@ -9101,7 +9103,7 @@ INT16 K_UpdateSteeringValue(INT16 inputSteering, INT16 destSteering)
|
|||
INT16 diff = destSteering - inputSteering;
|
||||
INT16 outputSteering = inputSteering;
|
||||
|
||||
|
||||
|
||||
// We switched steering directions, lighten up on easing for a more responsive countersteer.
|
||||
// (Don't do this for steering 0, let digital inputs tap-adjust!)
|
||||
if ((inputSteering > 0 && destSteering < 0) || (inputSteering < 0 && destSteering > 0))
|
||||
|
|
@ -9245,13 +9247,13 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
|
|||
fixed_t finalhandleboost = player->handleboost;
|
||||
|
||||
// If you're sliptiding, don't interact with handling boosts.
|
||||
// You need turning power proportional to your speed, no matter what!
|
||||
// You need turning power proportional to your speed, no matter what!
|
||||
fixed_t topspeed = K_GetKartSpeed(player, false, false);
|
||||
if (K_Sliptiding(player))
|
||||
{
|
||||
finalhandleboost = FixedMul(5*SLIPTIDEHANDLING/4, FixedDiv(player->speed, topspeed));
|
||||
}
|
||||
|
||||
|
||||
if (finalhandleboost > 0 && player->respawn.state == RESPAWNST_NONE)
|
||||
{
|
||||
turnfixed = FixedMul(turnfixed, FRACUNIT + finalhandleboost);
|
||||
|
|
@ -9336,7 +9338,7 @@ void K_SpawnDriftBoostExplosion(player_t *player, int stage)
|
|||
break;
|
||||
|
||||
case 2:
|
||||
|
||||
|
||||
overlay->fuse = 32;
|
||||
S_StartSound(player->mo, sfx_kc5b);
|
||||
break;
|
||||
|
|
@ -9604,7 +9606,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
&& player->speed >= K_GetKartSpeed(player, false, true)) // and we're above the threshold to spawn dust...
|
||||
{
|
||||
keepsliptide = true; // Then keep your current sliptide, but note the behavior change for sliptidezip handling.
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!player->drift)
|
||||
|
|
@ -9613,7 +9615,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
player->aizdriftstrat = ((player->drift > 0) ? 1 : -1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ((player->aizdriftstrat && !player->drift)
|
||||
|| (keepsliptide))
|
||||
{
|
||||
|
|
@ -9623,7 +9625,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
{
|
||||
// Give charge proportional to your angle. Sharp turns are rewarding, slow analog slides are not—remember, this is giving back the speed you gave up.
|
||||
UINT16 addCharge = FixedInt(
|
||||
FixedMul(10*FRACUNIT,
|
||||
FixedMul(10*FRACUNIT,
|
||||
FixedDiv(abs(player->steering)*FRACUNIT, (9*KART_FULLTURN/10)*FRACUNIT)
|
||||
));
|
||||
addCharge = min(10, max(addCharge, 1));
|
||||
|
|
@ -9635,7 +9637,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
|
||||
if (player->sliptideZip >= MIN_WAVEDASH_CHARGE && (player->sliptideZip - addCharge) < MIN_WAVEDASH_CHARGE)
|
||||
S_StartSound(player->mo, sfx_waved5);
|
||||
}
|
||||
}
|
||||
|
||||
if (abs(player->aizdrifttilt) < ANGLE_22h)
|
||||
{
|
||||
|
|
@ -10400,7 +10402,7 @@ static void K_KartSpindash(player_t *player)
|
|||
player->spindash++;
|
||||
if (!S_SoundPlaying(player->mo, sfx_kc38))
|
||||
S_StartSound(player->mo, sfx_kc38);
|
||||
}
|
||||
}
|
||||
|
||||
if (player->spindash >= SPINDASHTHRUSTTIME)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -184,6 +184,21 @@ void Obj_SymbolSpawn(mobj_t *mobj);
|
|||
void Obj_SymbolSetup(mobj_t *mobj, mapthing_t *mthing);
|
||||
void Obj_SymbolThink(mobj_t *mobj);
|
||||
|
||||
/* Dash Rings */
|
||||
void Obj_RegularDashRingSpawn(mobj_t *mobj);
|
||||
void Obj_RainbowDashRingSpawn(mobj_t *mobj);
|
||||
void Obj_DashRingSetup(mobj_t *mobj, mapthing_t *mthing);
|
||||
void Obj_RainbowDashRingThink(mobj_t *mobj);
|
||||
void Obj_DashRingTouch(mobj_t *mobj, player_t *player);
|
||||
void Obj_DashRingPlayerThink(player_t *player);
|
||||
boolean Obj_DashRingPlayerHasNoGravity(player_t *player);
|
||||
|
||||
/* Sneaker Panels */
|
||||
void Obj_SneakerPanelSpriteScale(mobj_t *mobj);
|
||||
void Obj_SneakerPanelSpawn(mobj_t *mobj);
|
||||
void Obj_SneakerPanelSetup(mobj_t *mobj, mapthing_t *mthing);
|
||||
void Obj_SneakerPanelCollide(mobj_t *pad, mobj_t *mo);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -409,8 +409,12 @@ static int player_get(lua_State *L)
|
|||
lua_pushinteger(L, plr->trickboostdecay);
|
||||
else if (fastcmp(field,"trickboost"))
|
||||
lua_pushinteger(L, plr->trickboost);
|
||||
else if (fastcmp(field,"dashRingPullTics"))
|
||||
lua_pushinteger(L, plr->dashRingPullTics);
|
||||
else if (fastcmp(field,"dashRingPushTics"))
|
||||
lua_pushinteger(L, plr->dashRingPushTics);
|
||||
else if (fastcmp(field,"roundscore"))
|
||||
plr->roundscore = luaL_checkinteger(L, 3);
|
||||
lua_pushinteger(L, plr->roundscore);
|
||||
else if (fastcmp(field,"emeralds"))
|
||||
lua_pushinteger(L, plr->emeralds);
|
||||
else if (fastcmp(field,"karmadelay"))
|
||||
|
|
@ -730,7 +734,7 @@ static int player_set(lua_State *L)
|
|||
else if (fastcmp(field,"sliptideZipBoost"))
|
||||
plr->sliptideZipBoost = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"instaShieldCooldown"))
|
||||
plr->instaShieldCooldown = luaL_checkinteger(L, 3);
|
||||
plr->instaShieldCooldown = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"guardCooldown"))
|
||||
plr->guardCooldown = luaL_checkinteger(L, 3);
|
||||
/*
|
||||
|
|
@ -813,8 +817,12 @@ static int player_set(lua_State *L)
|
|||
plr->trickboostdecay = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"trickboost"))
|
||||
plr->trickboost = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"dashRingPullTics"))
|
||||
plr->dashRingPullTics = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"dashRingPushTics"))
|
||||
plr->dashRingPushTics = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"roundscore"))
|
||||
lua_pushinteger(L, plr->roundscore);
|
||||
plr->roundscore = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"emeralds"))
|
||||
plr->emeralds = luaL_checkinteger(L, 3);
|
||||
else if (fastcmp(field,"karmadelay"))
|
||||
|
|
|
|||
|
|
@ -25,4 +25,6 @@ target_sources(SRB2SDL2 PRIVATE
|
|||
battle-ufo.cpp
|
||||
powerup-aura.cpp
|
||||
symbol.c
|
||||
dash-rings.c
|
||||
sneaker-panel.c
|
||||
)
|
||||
|
|
|
|||
267
src/objects/dash-rings.c
Normal file
267
src/objects/dash-rings.c
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
#include "../p_local.h"
|
||||
#include "../k_kart.h"
|
||||
#include "../k_objects.h"
|
||||
#include "../s_sound.h"
|
||||
|
||||
// Dash Rings are scaled by this much relative to the map scale
|
||||
#define DASHRING_SCALE (3*FRACUNIT/2)
|
||||
|
||||
// Dash Ring angles are defined by their mapthing's args[0] (previously used mapthing->options flags, hence the selections)
|
||||
#define DASHRING_TYPE_HORIZONTAL 0
|
||||
#define DASHRING_TYPE_30DEGREES 1
|
||||
#define DASHRING_TYPE_60DEGREES 4
|
||||
#define DASHRING_TYPE_VERTICAL 8
|
||||
|
||||
// Dash Rings must be this far apart for players to interact with them in succession
|
||||
#define DASHRING_MIN_SPACING_HORIZONTAL (512*FRACUNIT)
|
||||
#define DASHRING_MIN_SPACING_VERTICAL (384*FRACUNIT)
|
||||
|
||||
// timer values
|
||||
#define DASHRING_PULL_TICS 5
|
||||
#define DASHRING_PUSH_TICS (TICRATE/2)
|
||||
#define DASHRING_ANTIGRAVITY_TICS 5
|
||||
|
||||
// base launch speed
|
||||
#define DASHRING_BASE_LAUNCH_SPEED (48*FRACUNIT)
|
||||
|
||||
// factor of distance traveled per tic while being pulled towards a Dash Ring
|
||||
#define DASHRING_PULL_FACTOR (FRACUNIT/3)
|
||||
|
||||
static const skincolornum_t ring_colors[] = {
|
||||
SKINCOLOR_GREY, // 1x
|
||||
SKINCOLOR_TAN, // 1.25x
|
||||
SKINCOLOR_YELLOW, // 1.5x
|
||||
SKINCOLOR_TANGERINE, // 1.75x
|
||||
SKINCOLOR_KETCHUP, // 2x
|
||||
SKINCOLOR_MOONSET, // 2.25x
|
||||
SKINCOLOR_ULTRAMARINE, // 2.5x +
|
||||
};
|
||||
|
||||
static const skincolornum_t rainbow_colors[] = {
|
||||
SKINCOLOR_PINK,
|
||||
SKINCOLOR_CREAMSICLE,
|
||||
SKINCOLOR_TAN,
|
||||
SKINCOLOR_TURTLE,
|
||||
SKINCOLOR_TURQUOISE,
|
||||
SKINCOLOR_THISTLE,
|
||||
};
|
||||
|
||||
void Obj_RegularDashRingSpawn(mobj_t *mobj)
|
||||
{
|
||||
P_SetScale(mobj, mobj->destscale = FixedMul(mobj->scale, DASHRING_SCALE));
|
||||
mobj->renderflags |= RF_SEMIBRIGHT;
|
||||
|
||||
P_SetTarget(&mobj->tracer, P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_OVERLAY));
|
||||
P_SetTarget(&mobj->tracer->target, mobj);
|
||||
P_SetMobjState(mobj->tracer, S_DASHRING_HORIZONTAL_FLASH1);
|
||||
mobj->tracer->color = SKINCOLOR_WHITE;
|
||||
mobj->tracer->renderflags |= RF_SEMIBRIGHT;
|
||||
}
|
||||
|
||||
void Obj_RainbowDashRingSpawn(mobj_t *mobj)
|
||||
{
|
||||
P_SetScale(mobj, mobj->destscale = FixedMul(mobj->scale, DASHRING_SCALE));
|
||||
mobj->renderflags |= RF_FULLBRIGHT;
|
||||
}
|
||||
|
||||
void Obj_DashRingSetup(mobj_t *mobj, mapthing_t *mthing)
|
||||
{
|
||||
static const UINT8 numColors = sizeof(rainbow_colors) / sizeof(skincolornum_t);
|
||||
const UINT8 additionalThrust = mthing->args[1];
|
||||
statenum_t ringState, overlayState;
|
||||
|
||||
mobj->extravalue1 = mthing->args[0];
|
||||
mobj->cusval = 4 + additionalThrust;
|
||||
|
||||
switch (mobj->extravalue1)
|
||||
{
|
||||
case DASHRING_TYPE_30DEGREES:
|
||||
ringState = S_DASHRING_30DEGREES;
|
||||
overlayState = S_DASHRING_30DEGREES_FLASH1;
|
||||
break;
|
||||
case DASHRING_TYPE_60DEGREES:
|
||||
ringState = S_DASHRING_60DEGREES;
|
||||
overlayState = S_DASHRING_60DEGREES_FLASH1;
|
||||
break;
|
||||
case DASHRING_TYPE_VERTICAL:
|
||||
ringState = S_DASHRING_VERTICAL;
|
||||
overlayState = S_DASHRING_VERTICAL_FLASH1;
|
||||
break;
|
||||
case DASHRING_TYPE_HORIZONTAL:
|
||||
default:
|
||||
ringState = S_DASHRING_HORIZONTAL;
|
||||
overlayState = S_DASHRING_HORIZONTAL_FLASH1;
|
||||
break;
|
||||
}
|
||||
|
||||
P_SetMobjState(mobj, ringState);
|
||||
if (!P_MobjWasRemoved(mobj->tracer))
|
||||
P_SetMobjState(mobj->tracer, overlayState);
|
||||
|
||||
mobj->spriteyoffset = mobj->info->height >> 1; // I think this is to center the sprite within its hitbox regardless of height
|
||||
mobj->color = ring_colors[min(additionalThrust, numColors - 1)];
|
||||
}
|
||||
|
||||
void Obj_RainbowDashRingThink(mobj_t *mobj)
|
||||
{
|
||||
static const UINT8 numColors = sizeof(rainbow_colors) / sizeof(skincolornum_t);
|
||||
mobj->color = rainbow_colors[(leveltime / 2) % numColors];
|
||||
}
|
||||
|
||||
static boolean DashRingsAreTooClose(mobj_t *ring1, mobj_t *ring2)
|
||||
{
|
||||
if (ring1 == ring2)
|
||||
return true;
|
||||
|
||||
if ((FixedHypot(ring2->x - ring1->x, ring2->y - ring1->y) < FixedMul(DASHRING_MIN_SPACING_HORIZONTAL, mapobjectscale))
|
||||
&& (abs(ring1->z - ring2->z) < FixedMul(DASHRING_MIN_SPACING_VERTICAL, mapobjectscale)))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void Obj_DashRingTouch(mobj_t *ring, player_t *player)
|
||||
{
|
||||
if (player->carry != CR_NONE)
|
||||
{
|
||||
if (player->carry != CR_DASHRING) // being carried by something else
|
||||
return;
|
||||
|
||||
if (player->dashRingPullTics > 0) // being pulled into a dash ring already
|
||||
return;
|
||||
|
||||
if (player->dashRingPushTics > 0 && !P_MobjWasRemoved(player->mo->tracer) && DashRingsAreTooClose(player->mo->tracer, ring)) // dash ring is too close to recently used dash ring
|
||||
return;
|
||||
}
|
||||
|
||||
P_SetTarget(&player->mo->tracer, ring);
|
||||
player->carry = CR_DASHRING;
|
||||
player->dashRingPullTics = DASHRING_PULL_TICS;
|
||||
player->dashRingPushTics = 0;
|
||||
}
|
||||
|
||||
static fixed_t GetPlayerDashRingZ(player_t *player, mobj_t *ring)
|
||||
{
|
||||
return (ring->z + (ring->height >> 1) - (player->mo->height >> 1));
|
||||
}
|
||||
|
||||
static void DashRingLaunch(player_t *player, mobj_t *ring)
|
||||
{
|
||||
mobj_t *ghost = P_SpawnGhostMobj(ring);
|
||||
const fixed_t launchSpeed = FixedMul(DASHRING_BASE_LAUNCH_SPEED * ring->cusval / 4, mapobjectscale);
|
||||
angle_t pitch;
|
||||
|
||||
ghost->destscale = ring->scale * 8;
|
||||
ghost->scalespeed = ring->scale / 12;
|
||||
ghost->old_z = ghost->z += P_MobjFlip(ring) * FixedMul(ghost->spriteyoffset, ghost->scale); // apply sprite offset to physical position instead, so ghost is centered
|
||||
ghost->spriteyoffset = 0;
|
||||
|
||||
P_MoveOrigin(player->mo, ring->x, ring->y, GetPlayerDashRingZ(player, ring));
|
||||
player->dashRingPullTics = 0;
|
||||
player->dashRingPushTics = DASHRING_PUSH_TICS;
|
||||
|
||||
player->mo->rollangle = 0;
|
||||
player->flashing = 0;
|
||||
player->fastfall = 0;
|
||||
|
||||
switch (ring->extravalue1)
|
||||
{
|
||||
case DASHRING_TYPE_30DEGREES:
|
||||
pitch = 30 * ANG1;
|
||||
break;
|
||||
case DASHRING_TYPE_60DEGREES:
|
||||
pitch = 60 * ANG1;
|
||||
break;
|
||||
case DASHRING_TYPE_VERTICAL:
|
||||
pitch = 90 * ANG1;
|
||||
break;
|
||||
case DASHRING_TYPE_HORIZONTAL:
|
||||
default:
|
||||
pitch = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
P_InstaThrust(player->mo, ring->angle, P_ReturnThrustX(NULL, pitch, launchSpeed));
|
||||
player->mo->momz = P_MobjFlip(ring) * P_ReturnThrustY(NULL, pitch, launchSpeed);
|
||||
|
||||
S_StartSound(player->mo, ring->info->seesound);
|
||||
}
|
||||
|
||||
static void RegularDashRingLaunch(player_t *player, mobj_t *ring)
|
||||
{
|
||||
player->springstars = TICRATE/2;
|
||||
player->springcolor = ring->color;
|
||||
DashRingLaunch(player, ring);
|
||||
}
|
||||
|
||||
static void RainbowDashRingLaunch(player_t *player, mobj_t *ring)
|
||||
{
|
||||
player->mo->eflags &= ~MFE_SPRUNG;
|
||||
player->trickpanel = 1;
|
||||
player->pflags |= PF_TRICKDELAY;
|
||||
K_DoPogoSpring(player->mo, 0, 0);
|
||||
DashRingLaunch(player, ring);
|
||||
}
|
||||
|
||||
void Obj_DashRingPlayerThink(player_t *player)
|
||||
{
|
||||
if (player->carry != CR_DASHRING)
|
||||
return;
|
||||
|
||||
if (player->dashRingPullTics > 0)
|
||||
{
|
||||
mobj_t *ring = player->mo->tracer;
|
||||
|
||||
if (P_MobjWasRemoved(player->mo->tracer))
|
||||
{
|
||||
player->carry = CR_NONE;
|
||||
player->dashRingPullTics = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
player->mo->momx = FixedMul(DASHRING_PULL_FACTOR, ring->x - player->mo->x);
|
||||
player->mo->momy = FixedMul(DASHRING_PULL_FACTOR, ring->y - player->mo->y);
|
||||
player->mo->momz = FixedMul(DASHRING_PULL_FACTOR, GetPlayerDashRingZ(player, ring) - player->mo->z);
|
||||
player->mo->rollangle = (angle_t)FixedMul(DASHRING_PULL_FACTOR, (fixed_t)player->mo->rollangle);
|
||||
|
||||
if (--player->dashRingPullTics == 0)
|
||||
{
|
||||
if (ring->type == MT_DASHRING)
|
||||
{
|
||||
RegularDashRingLaunch(player, ring);
|
||||
}
|
||||
else
|
||||
{
|
||||
RainbowDashRingLaunch(player, ring);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (player->dashRingPushTics > 0)
|
||||
{
|
||||
if (leveltime & 1)
|
||||
{
|
||||
mobj_t *ghost = P_SpawnGhostMobj(player->mo);
|
||||
ghost->colorized = true;
|
||||
ghost->fuse = 3;
|
||||
}
|
||||
|
||||
if (--player->dashRingPushTics == 0)
|
||||
{
|
||||
player->carry = CR_NONE;
|
||||
P_SetTarget(&player->mo->tracer, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean Obj_DashRingPlayerHasNoGravity(player_t *player)
|
||||
{
|
||||
if (player->dashRingPullTics > 0)
|
||||
return true;
|
||||
|
||||
if (player->dashRingPushTics >= DASHRING_PUSH_TICS - DASHRING_ANTIGRAVITY_TICS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
122
src/objects/sneaker-panel.c
Normal file
122
src/objects/sneaker-panel.c
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
#include "../r_main.h"
|
||||
#include "../p_slopes.h"
|
||||
#include "../p_local.h"
|
||||
#include "../k_kart.h"
|
||||
|
||||
#define SNEAKERPANEL_RADIUS (64*FRACUNIT)
|
||||
|
||||
void Obj_SneakerPanelSpriteScale(mobj_t *mobj)
|
||||
{
|
||||
statenum_t newState;
|
||||
fixed_t spriteScale;
|
||||
|
||||
if (mobj->scale == mobj->movefactor)
|
||||
return;
|
||||
|
||||
mobj->movefactor = mobj->scale;
|
||||
|
||||
if (mobj->scale > FRACUNIT >> 1)
|
||||
{
|
||||
newState = S_SNEAKERPANEL;
|
||||
spriteScale = FRACUNIT;
|
||||
}
|
||||
else if (mobj->scale > FRACUNIT >> 2)
|
||||
{
|
||||
newState = S_SNEAKERPANEL_SMALL;
|
||||
spriteScale = FRACUNIT << 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
newState = S_SNEAKERPANEL_TINY;
|
||||
spriteScale = FRACUNIT << 2;
|
||||
}
|
||||
|
||||
if (((statenum_t)(mobj->state - states)) != newState)
|
||||
{
|
||||
P_SetMobjState(mobj, newState);
|
||||
mobj->spritexscale = mobj->spriteyscale = spriteScale;
|
||||
}
|
||||
}
|
||||
|
||||
void Obj_SneakerPanelSpawn(mobj_t *mobj)
|
||||
{
|
||||
mobj->renderflags |= RF_OBJECTSLOPESPLAT | RF_NOSPLATBILLBOARD;
|
||||
Obj_SneakerPanelSpriteScale(mobj);
|
||||
}
|
||||
|
||||
void Obj_SneakerPanelSetup(mobj_t *mobj, mapthing_t *mthing)
|
||||
{
|
||||
if (mthing->options & MTF_OBJECTFLIP)
|
||||
{
|
||||
mobj->eflags |= MFE_VERTICALFLIP;
|
||||
mobj->flags2 |= MF2_OBJECTFLIP;
|
||||
}
|
||||
P_TryMove(mobj, mobj->x, mobj->y, true, NULL); // sets standingslope
|
||||
Obj_SneakerPanelSpriteScale(mobj);
|
||||
}
|
||||
|
||||
void Obj_SneakerPanelCollide(mobj_t *panel, mobj_t *mo)
|
||||
{
|
||||
pslope_t *slope = panel->standingslope;
|
||||
player_t *player = mo->player;
|
||||
fixed_t playerTop = mo->z + mo->height, playerBottom = mo->z;
|
||||
fixed_t panelTop, panelBottom, dist, x, y, radius;
|
||||
angle_t angle;
|
||||
|
||||
// only players can boost!
|
||||
if (player == NULL)
|
||||
return;
|
||||
|
||||
// these aren't aerial boosters, so you do need to be on the ground
|
||||
if (!P_IsObjectOnGround(mo))
|
||||
return;
|
||||
|
||||
// player needs to have the same gravflip status as the panel
|
||||
if ((panel->eflags & MFE_VERTICALFLIP) != (mo->eflags & MFE_VERTICALFLIP))
|
||||
return;
|
||||
|
||||
// find the x and y coordinates of the player relative to the booster's angle
|
||||
dist = R_PointToDist2(panel->x, panel->y, mo->x, mo->y);
|
||||
angle = R_PointToAngle2(panel->x, panel->y, mo->x, mo->y) - panel->angle;
|
||||
x = P_ReturnThrustX(NULL, angle, dist);
|
||||
y = P_ReturnThrustY(NULL, angle, dist);
|
||||
|
||||
// check that these coordinates fall within the square panel
|
||||
radius = FixedMul(SNEAKERPANEL_RADIUS, panel->scale);
|
||||
|
||||
if (x < -radius || x > radius || y < -radius || y > radius)
|
||||
return; // out of bounds
|
||||
|
||||
// check that the player is within reasonable vertical bounds
|
||||
if (slope == NULL)
|
||||
{
|
||||
panelTop = panel->z + panel->height;
|
||||
panelBottom = panel->z;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = P_ReturnThrustX(NULL, slope->xydirection, panel->radius);
|
||||
y = P_ReturnThrustY(NULL, slope->xydirection, panel->radius);
|
||||
panelTop = P_GetSlopeZAt(slope, panel->x + x, panel->y + y);
|
||||
panelBottom = P_GetSlopeZAt(slope, panel->x - x, panel->y - y);
|
||||
|
||||
if (panelTop < panelBottom)
|
||||
{
|
||||
// variable swap
|
||||
panelTop = panelTop + panelBottom;
|
||||
panelBottom = panelTop - panelBottom;
|
||||
panelTop = panelTop - panelBottom;
|
||||
}
|
||||
}
|
||||
|
||||
if ((playerBottom > panelTop) || (playerTop < panelBottom))
|
||||
return;
|
||||
|
||||
// boost!
|
||||
if (player->floorboost == 0)
|
||||
player->floorboost = 3;
|
||||
else
|
||||
player->floorboost = 2;
|
||||
|
||||
K_DoSneaker(player, 0);
|
||||
}
|
||||
|
|
@ -330,6 +330,7 @@ void A_FlameShieldPaper(mobj_t *actor);
|
|||
void A_InvincSparkleRotate(mobj_t *actor);
|
||||
void A_SpawnItemDebrisCloud(mobj_t *actor);
|
||||
void A_RingShooterFace(mobj_t *actor);
|
||||
void A_SpawnSneakerPanel(mobj_t *actor);
|
||||
|
||||
//for p_enemy.c
|
||||
|
||||
|
|
@ -13661,6 +13662,11 @@ A_SpawnItemDebrisCloud (mobj_t *actor)
|
|||
fixed_t kartspeed;
|
||||
fixed_t fade;
|
||||
|
||||
if (LUA_CallAction(A_SPAWNITEMDEBRISCLOUD, (actor)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (target == NULL || target->player == NULL)
|
||||
{
|
||||
return;
|
||||
|
|
@ -13721,7 +13727,8 @@ A_SpawnItemDebrisCloud (mobj_t *actor)
|
|||
}
|
||||
}
|
||||
|
||||
// sets the actor's
|
||||
// Assumes the actor is the screen of a Ring Shooter
|
||||
// Changes the screen to display the WANTED icon of the Ring Shooter's owner, stretching it to match the screen's dimensions
|
||||
// vars do nothing
|
||||
void A_RingShooterFace(mobj_t *actor)
|
||||
{
|
||||
|
|
@ -13732,3 +13739,35 @@ void A_RingShooterFace(mobj_t *actor)
|
|||
|
||||
Obj_UpdateRingShooterFace(actor);
|
||||
}
|
||||
|
||||
// Function: A_SpawnSneakerPanel
|
||||
//
|
||||
// Description: Spawns a sneaker panel object relative to the location of the actor
|
||||
//
|
||||
// var1:
|
||||
// var1 >> 16 = x offset
|
||||
// var1 & 65535 = y offset
|
||||
// var2:
|
||||
// var2 >> 16 = z
|
||||
// var2 & 65535 = unused
|
||||
//
|
||||
void A_SpawnSneakerPanel(mobj_t *actor)
|
||||
{
|
||||
INT16 x, y, z;
|
||||
mobj_t *mo;
|
||||
INT32 locvar1 = var1;
|
||||
INT32 locvar2 = var2;
|
||||
|
||||
if (LUA_CallAction(A_SPAWNSNEAKERPANEL, actor))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
x = (INT16)(locvar1 >> 16);
|
||||
y = (INT16)(locvar1 & 65535);
|
||||
z = (INT16)(locvar2 >> 16);
|
||||
|
||||
mo = P_SpawnMobjFromMobj(actor, x << FRACBITS, y << FRACBITS, z << FRACBITS, MT_SNEAKERPANEL);
|
||||
mo->angle = actor->angle;
|
||||
Obj_SneakerPanelSpriteScale(mo);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -664,6 +664,11 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
Obj_SuperFlickyPlayerCollide(special, toucher);
|
||||
return;
|
||||
|
||||
case MT_DASHRING:
|
||||
case MT_RAINBOWDASHRING:
|
||||
Obj_DashRingTouch(special, player);
|
||||
return;
|
||||
|
||||
default: // SOC or script pickup
|
||||
P_SetTarget(&special->target, toucher);
|
||||
break;
|
||||
|
|
|
|||
11
src/p_map.c
11
src/p_map.c
|
|
@ -1151,6 +1151,17 @@ static BlockItReturn_t PIT_CheckThing(mobj_t *thing)
|
|||
return K_FallingRockCollide(thing, tm.thing) ? BMIT_CONTINUE : BMIT_ABORT;
|
||||
}
|
||||
|
||||
if (thing->type == MT_SNEAKERPANEL)
|
||||
{
|
||||
Obj_SneakerPanelCollide(thing, tm.thing);
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
else if (tm.thing->type == MT_SNEAKERPANEL)
|
||||
{
|
||||
Obj_SneakerPanelCollide(tm.thing, thing);
|
||||
return BMIT_CONTINUE;
|
||||
}
|
||||
|
||||
//}
|
||||
|
||||
if ((thing->type == MT_SPRINGSHELL || thing->type == MT_YELLOWSHELL) && thing->health > 0
|
||||
|
|
|
|||
40
src/p_mobj.c
40
src/p_mobj.c
|
|
@ -128,11 +128,10 @@ static void P_SetupStateAnimation(mobj_t *mobj, state_t *st)
|
|||
|
||||
if (st->frame & FF_GLOBALANIM)
|
||||
{
|
||||
// Attempt to account for the pre-ticker for objects spawned on load
|
||||
if (!leveltime) return;
|
||||
|
||||
mobj->anim_duration -= (leveltime + 2) % st->var2; // Duration synced to timer
|
||||
mobj->frame += ((leveltime + 2) / st->var2) % (animlength + 1); // Frame synced to timer (duration taken into account)
|
||||
mobj->anim_duration -= (leveltime % st->var2); // Duration synced to timer
|
||||
mobj->frame += (leveltime / st->var2) % (animlength + 1); // Frame synced to timer (duration taken into account)
|
||||
if (!thinkersCompleted) // objects spawned BEFORE (or during) thinkers will think during this tic...
|
||||
mobj->anim_duration++; // ...so increase the duration of their current frame by 1 to sync with objects spawned AFTER thinkers
|
||||
}
|
||||
else if (st->frame & FF_RANDOMANIM)
|
||||
{
|
||||
|
|
@ -1159,6 +1158,11 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
|
|||
gravityadd = FixedMul(TUMBLEGRAVITY, gravityadd);
|
||||
}
|
||||
|
||||
if (mo->player->carry == CR_DASHRING && Obj_DashRingPlayerHasNoGravity(mo->player))
|
||||
{
|
||||
gravityadd = 0;
|
||||
}
|
||||
|
||||
if (K_IsHoldingDownTop(mo->player))
|
||||
{
|
||||
gravityadd *= 3;
|
||||
|
|
@ -9600,6 +9604,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
return false;
|
||||
}
|
||||
break;
|
||||
case MT_RAINBOWDASHRING:
|
||||
Obj_RainbowDashRingThink(mobj);
|
||||
break;
|
||||
default:
|
||||
// check mobj against possible water content, before movement code
|
||||
P_MobjCheckWater(mobj);
|
||||
|
|
@ -10438,6 +10445,9 @@ static void P_DefaultMobjShadowScale(mobj_t *thing)
|
|||
case MT_DRIFTCLIP:
|
||||
thing->shadowscale = FRACUNIT/3;
|
||||
break;
|
||||
case MT_SNEAKERPANEL:
|
||||
thing->shadowscale = 0;
|
||||
break;
|
||||
default:
|
||||
if (thing->flags & (MF_ENEMY|MF_BOSS))
|
||||
thing->shadowscale = FRACUNIT;
|
||||
|
|
@ -10988,6 +10998,15 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
|
|||
case MT_SYMBOL:
|
||||
Obj_SymbolSpawn(mobj);
|
||||
break;
|
||||
case MT_DASHRING:
|
||||
Obj_RegularDashRingSpawn(mobj);
|
||||
break;
|
||||
case MT_RAINBOWDASHRING:
|
||||
Obj_RainbowDashRingSpawn(mobj);
|
||||
break;
|
||||
case MT_SNEAKERPANEL:
|
||||
Obj_SneakerPanelSpawn(mobj);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -13562,6 +13581,17 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
|
|||
Obj_SymbolSetup(mobj, mthing);
|
||||
break;
|
||||
}
|
||||
case MT_DASHRING:
|
||||
case MT_RAINBOWDASHRING:
|
||||
{
|
||||
Obj_DashRingSetup(mobj, mthing);
|
||||
break;
|
||||
}
|
||||
case MT_SNEAKERPANEL:
|
||||
{
|
||||
Obj_SneakerPanelSetup(mobj, mthing);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -185,7 +185,7 @@ static boolean P_UnArchivePlayer(savebuffer_t *save)
|
|||
savedata.bots[pid].score = READUINT32(save->p);
|
||||
}
|
||||
|
||||
return (pid == 0xFE);
|
||||
return (pid == 0xFE);
|
||||
}
|
||||
|
||||
static void P_NetArchivePlayers(savebuffer_t *save)
|
||||
|
|
@ -500,6 +500,9 @@ static void P_NetArchivePlayers(savebuffer_t *save)
|
|||
WRITEUINT8(save->p, players[i].trickboostdecay);
|
||||
WRITEUINT8(save->p, players[i].trickboost);
|
||||
|
||||
WRITEUINT8(save->p, players[i].dashRingPullTics);
|
||||
WRITEUINT8(save->p, players[i].dashRingPushTics);
|
||||
|
||||
WRITEUINT32(save->p, players[i].ebrakefor);
|
||||
|
||||
WRITEUINT32(save->p, players[i].roundscore);
|
||||
|
|
@ -918,6 +921,9 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
|
|||
players[i].trickboostdecay = READUINT8(save->p);
|
||||
players[i].trickboost = READUINT8(save->p);
|
||||
|
||||
players[i].dashRingPullTics = READUINT8(save->p);
|
||||
players[i].dashRingPushTics = READUINT8(save->p);
|
||||
|
||||
players[i].ebrakefor = READUINT32(save->p);
|
||||
|
||||
players[i].roundscore = READUINT32(save->p);
|
||||
|
|
@ -5665,7 +5671,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending)
|
|||
}
|
||||
|
||||
WRITEUINT8(save->p, encoremode);
|
||||
|
||||
|
||||
WRITEUINT8(save->p, mapmusrng);
|
||||
|
||||
WRITEUINT32(save->p, leveltime);
|
||||
|
|
@ -5836,7 +5842,7 @@ static boolean P_NetUnArchiveMisc(savebuffer_t *save, boolean reloading)
|
|||
}
|
||||
|
||||
encoremode = (boolean)READUINT8(save->p);
|
||||
|
||||
|
||||
mapmusrng = READUINT8(save->p);
|
||||
|
||||
if (!P_LoadLevel(true, reloading))
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@
|
|||
#endif
|
||||
|
||||
tic_t leveltime;
|
||||
boolean thinkersCompleted;
|
||||
|
||||
INT32 P_AltFlip(INT32 n, tic_t tics)
|
||||
{
|
||||
|
|
@ -685,6 +686,8 @@ void P_Ticker(boolean run)
|
|||
quake_t *quake = NULL;
|
||||
INT32 i;
|
||||
|
||||
thinkersCompleted = false;
|
||||
|
||||
// Increment jointime and quittime even if paused
|
||||
for (i = 0; i < MAXPLAYERS; i++)
|
||||
{
|
||||
|
|
@ -794,6 +797,7 @@ void P_Ticker(boolean run)
|
|||
ps_thinkertime = I_GetPreciseTime();
|
||||
P_RunThinkers();
|
||||
ps_thinkertime = I_GetPreciseTime() - ps_thinkertime;
|
||||
thinkersCompleted = true;
|
||||
|
||||
// Run any "after all the other thinkers" stuff
|
||||
{
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ extern "C" {
|
|||
#endif
|
||||
|
||||
extern tic_t leveltime;
|
||||
extern boolean thinkersCompleted;
|
||||
|
||||
// Called by G_Ticker. Carries out all thinking of enemies and players.
|
||||
void Command_Numthinkers_f(void);
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"s3k47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Rising dust"}, // Kart AIZ dust
|
||||
{"s3k48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Pulse"},
|
||||
{"s3k49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Impact"}, // Kart bump sound
|
||||
{"s3k4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Grab"},
|
||||
{"s3k4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Grab"},
|
||||
{"s3k4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Splash"},
|
||||
{"s3k4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Heavy hit"},
|
||||
{"s3k4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing bullet"},
|
||||
|
|
@ -505,7 +505,7 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"s3k65", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Got sphere"}, // Blue Spheres
|
||||
{"s3k66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Special stage end"},
|
||||
{"s3k67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Firing missile"},
|
||||
{"s3k68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Discovery"}, // Kart final lap
|
||||
{"s3k68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Discovery"}, // Kart final lap
|
||||
{"s3k69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Switch click"},
|
||||
{"s3k6a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Special stage clear"}, // Kart finish
|
||||
{"s3k6b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Punch"},
|
||||
|
|
@ -1197,6 +1197,9 @@ sfxinfo_t S_sfx[NUMSFX] =
|
|||
{"fhurt1", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Whipped
|
||||
{"fhurt2", false, 255, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Hunting
|
||||
|
||||
{"dashr", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Regular Dash Ring
|
||||
{"rainbr", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Rainbow Dash Ring
|
||||
|
||||
// SRB2Kart - Engine sounds
|
||||
// Engine class A
|
||||
{"krta00", false, 48, 65, -1, NULL, 0, -1, -1, LUMPERROR, ""},
|
||||
|
|
|
|||
|
|
@ -1265,6 +1265,9 @@ typedef enum
|
|||
sfx_fhurt1,
|
||||
sfx_fhurt2,
|
||||
|
||||
sfx_dashr,
|
||||
sfx_rainbr,
|
||||
|
||||
// Next up: UNIQUE ENGINE SOUNDS! Hoooooo boy...
|
||||
// Engine class A - Low Speed, Low Weight
|
||||
sfx_krta00,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue