mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-18 07:22:28 +00:00
New emerald behavior in Match.
No longer turns you super, instead emeralds steal points from enemy players and give you (and relevant teammates) an invincibility + super sneakers monitor.
This commit is contained in:
parent
67fcff7ee7
commit
c6c4ab7c53
4 changed files with 147 additions and 89 deletions
|
@ -561,6 +561,17 @@ static int lib_pAddPlayerScore(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_pStealPlayerScore(lua_State *L)
|
||||||
|
{
|
||||||
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
UINT32 amount = (UINT32)luaL_checkinteger(L, 2);
|
||||||
|
NOHUD
|
||||||
|
if (!player)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
P_StealPlayerScore(player, amount);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int lib_pPlayerInPain(lua_State *L)
|
static int lib_pPlayerInPain(lua_State *L)
|
||||||
{
|
{
|
||||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
@ -1217,6 +1228,16 @@ static int lib_pDoNightsScore(lua_State *L)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int lib_pDoMatchSuper(lua_State *L)
|
||||||
|
{
|
||||||
|
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||||
|
NOHUD
|
||||||
|
if (!player)
|
||||||
|
return LUA_ErrInvalid(L, "player_t");
|
||||||
|
P_DoMatchSuper(player);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// P_SPEC
|
// P_SPEC
|
||||||
////////////
|
////////////
|
||||||
|
|
||||||
|
@ -1925,6 +1946,7 @@ static luaL_Reg lib[] = {
|
||||||
{"P_GetPlayerSpinHeight",lib_pGetPlayerSpinHeight},
|
{"P_GetPlayerSpinHeight",lib_pGetPlayerSpinHeight},
|
||||||
{"P_GetPlayerControlDirection",lib_pGetPlayerControlDirection},
|
{"P_GetPlayerControlDirection",lib_pGetPlayerControlDirection},
|
||||||
{"P_AddPlayerScore",lib_pAddPlayerScore},
|
{"P_AddPlayerScore",lib_pAddPlayerScore},
|
||||||
|
{"P_StealPlayerScore",lib_pStealPlayerScore},
|
||||||
{"P_PlayerInPain",lib_pPlayerInPain},
|
{"P_PlayerInPain",lib_pPlayerInPain},
|
||||||
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
||||||
{"P_ResetPlayer",lib_pResetPlayer},
|
{"P_ResetPlayer",lib_pResetPlayer},
|
||||||
|
@ -1984,6 +2006,7 @@ static luaL_Reg lib[] = {
|
||||||
{"P_PlayLivesJingle",lib_pPlayLivesJingle},
|
{"P_PlayLivesJingle",lib_pPlayLivesJingle},
|
||||||
{"P_CanPickupItem",lib_pCanPickupItem},
|
{"P_CanPickupItem",lib_pCanPickupItem},
|
||||||
{"P_DoNightsScore",lib_pDoNightsScore},
|
{"P_DoNightsScore",lib_pDoNightsScore},
|
||||||
|
{"P_DoMatchSuper",lib_pDoMatchSuper},
|
||||||
|
|
||||||
// p_spec
|
// p_spec
|
||||||
{"P_Thrust",lib_pThrust},
|
{"P_Thrust",lib_pThrust},
|
||||||
|
|
132
src/p_inter.c
132
src/p_inter.c
|
@ -217,6 +217,72 @@ void P_DoNightsScore(player_t *player)
|
||||||
dummymo->destscale = 2*FRACUNIT;
|
dummymo->destscale = 2*FRACUNIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// P_DoMatchSuper
|
||||||
|
//
|
||||||
|
// Checks if you have all 7 pw_emeralds, then turns you "super". =P
|
||||||
|
//
|
||||||
|
void P_DoMatchSuper(player_t *player)
|
||||||
|
{
|
||||||
|
UINT16 match_emeralds = player->powers[pw_emeralds];
|
||||||
|
boolean doteams = false;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// If this gametype has teams, check every player on your team for emeralds.
|
||||||
|
if (G_GametypeHasTeams())
|
||||||
|
{
|
||||||
|
doteams = true;
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
if (players[i].ctfteam == player->ctfteam)
|
||||||
|
match_emeralds |= players[i].powers[pw_emeralds];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ALL7EMERALDS(match_emeralds))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Got 'em all? Turn "super"!
|
||||||
|
player->powers[pw_emeralds] = 0;
|
||||||
|
player->powers[pw_invulnerability] = invulntics + 1;
|
||||||
|
player->powers[pw_sneakers] = player->powers[pw_invulnerability];
|
||||||
|
if (P_IsLocalPlayer(player) && !player->powers[pw_super])
|
||||||
|
{
|
||||||
|
S_StopMusic();
|
||||||
|
if (mariomode)
|
||||||
|
{
|
||||||
|
S_ChangeMusic(mus_minvnc, false);
|
||||||
|
G_GhostAddColor(GHC_INVINCIBLE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
S_ChangeMusic(mus_invinc, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also steal 50 points from every enemy, sealing your victory.
|
||||||
|
P_StealPlayerScore(player, 50);
|
||||||
|
|
||||||
|
// In a team game?
|
||||||
|
// Check everyone else on your team for emeralds, and turn those helpful assisting players invincible too.
|
||||||
|
if (doteams)
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
if (playeringame[i] && players[i].ctfteam == player->ctfteam
|
||||||
|
&& players[i].powers[pw_emeralds] != 0)
|
||||||
|
{
|
||||||
|
players[i].powers[pw_emeralds] = 0;
|
||||||
|
player->powers[pw_invulnerability] = invulntics + 1;
|
||||||
|
player->powers[pw_sneakers] = player->powers[pw_invulnerability];
|
||||||
|
if (P_IsLocalPlayer(player) && !player->powers[pw_super])
|
||||||
|
{
|
||||||
|
S_StopMusic();
|
||||||
|
if (mariomode)
|
||||||
|
{
|
||||||
|
S_ChangeMusic(mus_minvnc, false);
|
||||||
|
G_GhostAddColor(GHC_INVINCIBLE);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
S_ChangeMusic(mus_invinc, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Takes action based on a ::MF_SPECIAL thing touched by a player.
|
/** Takes action based on a ::MF_SPECIAL thing touched by a player.
|
||||||
* Actually, this just checks a few things (heights, toucher->player, no
|
* Actually, this just checks a few things (heights, toucher->player, no
|
||||||
* objectplace, no dead or disappearing things)
|
* objectplace, no dead or disappearing things)
|
||||||
|
@ -524,7 +590,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (special->threshold)
|
if (special->threshold)
|
||||||
|
{
|
||||||
player->powers[pw_emeralds] |= special->info->speed;
|
player->powers[pw_emeralds] |= special->info->speed;
|
||||||
|
P_DoMatchSuper(player);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
emeralds |= special->info->speed;
|
emeralds |= special->info->speed;
|
||||||
|
|
||||||
|
@ -545,6 +614,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player->powers[pw_emeralds] |= special->threshold;
|
player->powers[pw_emeralds] |= special->threshold;
|
||||||
|
P_DoMatchSuper(player);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Secret emblem thingy
|
// Secret emblem thingy
|
||||||
|
@ -1356,7 +1426,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player->powers[pw_invulnerability] || player->powers[pw_flashing]
|
if (player->powers[pw_invulnerability] || player->powers[pw_flashing]
|
||||||
|| (player->powers[pw_super] && !(ALL7EMERALDS(player->powers[pw_emeralds]))))
|
|| player->powers[pw_super])
|
||||||
return;
|
return;
|
||||||
if (player->powers[pw_shield] || player->bot) //If One-Hit Shield
|
if (player->powers[pw_shield] || player->bot) //If One-Hit Shield
|
||||||
{
|
{
|
||||||
|
@ -2434,16 +2504,7 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou
|
||||||
P_PlayerRingBurst(player, player->mo->health - 1);
|
P_PlayerRingBurst(player, player->mo->health - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
player->health = target->health = 1;
|
||||||
{
|
|
||||||
player->health -= 10;
|
|
||||||
if (player->health < 2)
|
|
||||||
player->health = 2;
|
|
||||||
target->health = player->health;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
player->health = target->health = 1;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2654,16 +2715,6 @@ static void P_ShieldDamage(player_t *player, mobj_t *inflictor, mobj_t *source,
|
||||||
|
|
||||||
static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
|
static void P_RingDamage(player_t *player, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype)
|
||||||
{
|
{
|
||||||
if (!(inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
|
||||||
{
|
|
||||||
P_DoPlayerPain(player, source, inflictor);
|
|
||||||
|
|
||||||
P_ForceFeed(player, 40, 10, TICRATE, 40 + min(damage, 100)*2);
|
|
||||||
|
|
||||||
if ((source && source->type == MT_SPIKE) || damagetype == DMG_SPIKE) // spikes
|
|
||||||
S_StartSound(player->mo, sfx_spkdth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (source && source->player && !player->powers[pw_super]) //don't score points against super players
|
if (source && source->player && !player->powers[pw_super]) //don't score points against super players
|
||||||
{
|
{
|
||||||
// Award no points when players shoot each other when cv_friendlyfire is on.
|
// Award no points when players shoot each other when cv_friendlyfire is on.
|
||||||
|
@ -2913,7 +2964,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (player->powers[pw_invulnerability] || player->powers[pw_flashing] // ignore bouncing & such in invulnerability
|
else if (player->powers[pw_invulnerability] || player->powers[pw_flashing] // ignore bouncing & such in invulnerability
|
||||||
|| (player->powers[pw_super] && !(ALL7EMERALDS(player->powers[pw_emeralds]) && inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player))))
|
|| player->powers[pw_super])
|
||||||
{
|
{
|
||||||
if (force || (inflictor && (inflictor->flags & MF_MISSILE)
|
if (force || (inflictor && (inflictor->flags & MF_MISSILE)
|
||||||
&& (inflictor->flags2 & MF2_SUPERFIRE)
|
&& (inflictor->flags2 & MF2_SUPERFIRE)
|
||||||
|
@ -2960,24 +3011,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
if (damagetype & DMG_DEATHMASK)
|
||||||
{
|
|
||||||
if (player->powers[pw_shield])
|
|
||||||
{
|
|
||||||
P_RemoveShield(player);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player->health -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
|
||||||
if (player->health < 2)
|
|
||||||
player->health = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
|
|
||||||
P_PlayerFlagBurst(player, false);
|
|
||||||
}
|
|
||||||
else if (damagetype & DMG_DEATHMASK)
|
|
||||||
player->health = 0;
|
player->health = 0;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -3001,13 +3035,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
P_DamageMobj(source, target, target, 1, 0);
|
P_DamageMobj(source, target, target, 1, 0);
|
||||||
|
|
||||||
// do the damage
|
// do the damage
|
||||||
if (player && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]) && inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player))
|
if (damagetype & DMG_DEATHMASK)
|
||||||
{
|
|
||||||
target->health -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
|
||||||
if (target->health < 2)
|
|
||||||
target->health = 2;
|
|
||||||
}
|
|
||||||
else if (damagetype & DMG_DEATHMASK)
|
|
||||||
target->health = 0;
|
target->health = 0;
|
||||||
else
|
else
|
||||||
target->health -= damage;
|
target->health -= damage;
|
||||||
|
@ -3022,10 +3050,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player)
|
if (player)
|
||||||
{
|
P_ResetPlayer(target->player);
|
||||||
if (!(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
|
||||||
P_ResetPlayer(target->player);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
switch (target->type)
|
switch (target->type)
|
||||||
{
|
{
|
||||||
|
@ -3051,10 +3076,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
||||||
if (target->state == &states[target->info->spawnstate] && target->info->seestate != S_NULL)
|
if (target->state == &states[target->info->spawnstate] && target->info->seestate != S_NULL)
|
||||||
{
|
{
|
||||||
if (player)
|
if (player)
|
||||||
{
|
P_SetPlayerMobjState(target, target->info->seestate);
|
||||||
if (!(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
|
||||||
P_SetPlayerMobjState(target, target->info->seestate);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
P_SetMobjState(target, target->info->seestate);
|
P_SetMobjState(target, target->info->seestate);
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,6 +385,7 @@ void P_ResetStarposts(void);
|
||||||
|
|
||||||
boolean P_CanPickupItem(player_t *player, boolean weapon);
|
boolean P_CanPickupItem(player_t *player, boolean weapon);
|
||||||
void P_DoNightsScore(player_t *player);
|
void P_DoNightsScore(player_t *player);
|
||||||
|
void P_DoMatchSuper(player_t *player);
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_SPEC
|
// P_SPEC
|
||||||
|
|
80
src/p_user.c
80
src/p_user.c
|
@ -997,6 +997,7 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
||||||
|
|
||||||
P_PlayerFlagBurst(player, false);
|
P_PlayerFlagBurst(player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Adds to the player's score
|
// Adds to the player's score
|
||||||
void P_AddPlayerScore(player_t *player, UINT32 amount)
|
void P_AddPlayerScore(player_t *player, UINT32 amount)
|
||||||
{
|
{
|
||||||
|
@ -1083,6 +1084,42 @@ void P_AddPlayerScore(player_t *player, UINT32 amount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Steals from every enemy's score.
|
||||||
|
void P_StealPlayerScore(player_t *player, UINT32 amount)
|
||||||
|
{
|
||||||
|
boolean teams = G_GametypeHasTeams();
|
||||||
|
UINT32 stolen = 0;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < MAXPLAYERS; i++)
|
||||||
|
{
|
||||||
|
if (&players[i] == player
|
||||||
|
|| (teams && players[i].ctfteam == player->ctfteam))
|
||||||
|
continue;
|
||||||
|
if (players[i].score >= amount)
|
||||||
|
{
|
||||||
|
stolen += amount;
|
||||||
|
players[i].score -= amount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stolen += players[i].score;
|
||||||
|
players[i].score = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (stolen > 0)
|
||||||
|
{
|
||||||
|
// In team match, all stolen points are removed from the enemy team's running score.
|
||||||
|
if (gametype == GT_TEAMMATCH)
|
||||||
|
{
|
||||||
|
if (player->ctfteam == 1)
|
||||||
|
bluescore -= amount;
|
||||||
|
else if (player->ctfteam == 2)
|
||||||
|
redscore -= amount;
|
||||||
|
}
|
||||||
|
P_AddPlayerScore(player, stolen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// P_PlayLivesJingle
|
// P_PlayLivesJingle
|
||||||
//
|
//
|
||||||
|
@ -3321,7 +3358,7 @@ static void P_DoSuperStuff(player_t *player)
|
||||||
return; // NiGHTS Super doesn't mix with normal super
|
return; // NiGHTS Super doesn't mix with normal super
|
||||||
|
|
||||||
// Does player have all emeralds? If so, flag the "Ready For Super!"
|
// Does player have all emeralds? If so, flag the "Ready For Super!"
|
||||||
if ((ALL7EMERALDS(emeralds) || ALL7EMERALDS(player->powers[pw_emeralds])) && player->health > 50)
|
if (ALL7EMERALDS(emeralds) && player->health > 50)
|
||||||
player->pflags |= PF_SUPERREADY;
|
player->pflags |= PF_SUPERREADY;
|
||||||
else
|
else
|
||||||
player->pflags &= ~PF_SUPERREADY;
|
player->pflags &= ~PF_SUPERREADY;
|
||||||
|
@ -3329,7 +3366,7 @@ static void P_DoSuperStuff(player_t *player)
|
||||||
if (player->powers[pw_super])
|
if (player->powers[pw_super])
|
||||||
{
|
{
|
||||||
// If you're super and not Sonic, de-superize!
|
// If you're super and not Sonic, de-superize!
|
||||||
if (!((ALL7EMERALDS(emeralds)) && (player->charflags & SF_SUPER)) && !(ALL7EMERALDS(player->powers[pw_emeralds])))
|
if (!(ALL7EMERALDS(emeralds) && player->charflags & SF_SUPER))
|
||||||
{
|
{
|
||||||
player->powers[pw_super] = 0;
|
player->powers[pw_super] = 0;
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
||||||
|
@ -3462,12 +3499,12 @@ static void P_DoSuperStuff(player_t *player)
|
||||||
//
|
//
|
||||||
boolean P_SuperReady(player_t *player)
|
boolean P_SuperReady(player_t *player)
|
||||||
{
|
{
|
||||||
if ((player->pflags & PF_SUPERREADY) && !player->powers[pw_super] && !player->powers[pw_tailsfly]
|
if (player->pflags & PF_SUPERREADY && !player->powers[pw_super] && !player->powers[pw_tailsfly]
|
||||||
&& !(player->powers[pw_shield] & SH_NOSTACK)
|
&& !(player->powers[pw_shield] & SH_NOSTACK)
|
||||||
&& !player->powers[pw_invulnerability]
|
&& !player->powers[pw_invulnerability]
|
||||||
&& !(maptol & TOL_NIGHTS) // don't turn 'regular super' in nights levels
|
&& !(maptol & TOL_NIGHTS) // don't turn 'regular super' in nights levels
|
||||||
&& player->pflags & PF_JUMPED
|
&& player->pflags & PF_JUMPED
|
||||||
&& ((player->charflags & SF_SUPER) || ALL7EMERALDS(player->powers[pw_emeralds])))
|
&& player->charflags & SF_SUPER)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -3995,13 +4032,6 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
player->pflags |= PF_GLIDING|PF_THOKKED;
|
player->pflags |= PF_GLIDING|PF_THOKKED;
|
||||||
player->glidetime = 0;
|
player->glidetime = 0;
|
||||||
|
|
||||||
if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
|
||||||
{
|
|
||||||
// Glide at double speed while super.
|
|
||||||
glidespeed *= 2;
|
|
||||||
player->pflags &= ~PF_THOKKED;
|
|
||||||
}
|
|
||||||
|
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
|
P_SetPlayerMobjState(player->mo, S_PLAY_GLIDE);
|
||||||
P_InstaThrust(player->mo, player->mo->angle, FixedMul(glidespeed, player->mo->scale));
|
P_InstaThrust(player->mo, player->mo->angle, FixedMul(glidespeed, player->mo->scale));
|
||||||
player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
|
player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
|
||||||
|
@ -4115,8 +4145,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
||||||
player->pflags &= ~PF_JUMPDOWN;
|
player->pflags &= ~PF_JUMPDOWN;
|
||||||
|
|
||||||
// Repeat abilities, but not double jump!
|
// Repeat abilities, but not double jump!
|
||||||
if ((player->charability2 == CA2_MULTIABILITY && player->charability != CA_DOUBLEJUMP)
|
if (player->charability2 == CA2_MULTIABILITY && player->charability != CA_DOUBLEJUMP)
|
||||||
|| (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
|
||||||
player->secondjump = 0;
|
player->secondjump = 0;
|
||||||
else if (player->charability == CA_FLOAT && player->secondjump == 1)
|
else if (player->charability == CA_FLOAT && player->secondjump == 1)
|
||||||
player->secondjump = 2;
|
player->secondjump = 2;
|
||||||
|
@ -4360,9 +4389,6 @@ static void P_2dMovement(player_t *player)
|
||||||
if (cmd->forwardmove != 0)
|
if (cmd->forwardmove != 0)
|
||||||
P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT,10*FRACUNIT), false);
|
P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT,10*FRACUNIT), false);
|
||||||
|
|
||||||
if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
|
||||||
player->mo->momz *= 2;
|
|
||||||
|
|
||||||
player->mo->momx = 0;
|
player->mo->momx = 0;
|
||||||
}
|
}
|
||||||
else if (cmd->sidemove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
else if (cmd->sidemove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
||||||
|
@ -4556,11 +4582,7 @@ static void P_3dMovement(player_t *player)
|
||||||
if (player->climbing)
|
if (player->climbing)
|
||||||
{
|
{
|
||||||
if (cmd->forwardmove)
|
if (cmd->forwardmove)
|
||||||
{
|
|
||||||
P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT, 10*FRACUNIT), false);
|
P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT, 10*FRACUNIT), false);
|
||||||
if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
|
||||||
player->mo->momz *= 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (!analogmove
|
else if (!analogmove
|
||||||
&& cmd->forwardmove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
&& cmd->forwardmove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
||||||
|
@ -4601,12 +4623,7 @@ static void P_3dMovement(player_t *player)
|
||||||
}
|
}
|
||||||
// Sideways movement
|
// Sideways movement
|
||||||
if (player->climbing)
|
if (player->climbing)
|
||||||
{
|
P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 10*FRACUNIT), player->mo->scale));
|
||||||
if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 5*FRACUNIT), player->mo->scale));
|
|
||||||
else
|
|
||||||
P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 10*FRACUNIT), player->mo->scale));
|
|
||||||
}
|
|
||||||
// Analog movement control
|
// Analog movement control
|
||||||
else if (analogmove)
|
else if (analogmove)
|
||||||
{
|
{
|
||||||
|
@ -6510,8 +6527,8 @@ static void P_MovePlayer(player_t *player)
|
||||||
P_ResetPlayer(player); // down, stop gliding.
|
P_ResetPlayer(player); // down, stop gliding.
|
||||||
if (onground)
|
if (onground)
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_WALK);
|
P_SetPlayerMobjState(player->mo, S_PLAY_WALK);
|
||||||
else if ((player->charability2 == CA2_MULTIABILITY)
|
else if (player->charability2 == CA2_MULTIABILITY
|
||||||
|| (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]) && player->charability == CA_GLIDEANDCLIMB))
|
&& player->charability == CA_GLIDEANDCLIMB)
|
||||||
{
|
{
|
||||||
player->pflags |= PF_JUMPED;
|
player->pflags |= PF_JUMPED;
|
||||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||||
|
@ -6764,11 +6781,6 @@ static void P_MovePlayer(player_t *player)
|
||||||
{
|
{
|
||||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_JUMP && !player->powers[pw_super])
|
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_JUMP && !player->powers[pw_super])
|
||||||
P_DoJumpShield(player);
|
P_DoJumpShield(player);
|
||||||
else if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]) && player->charability == CA_FLY)
|
|
||||||
{
|
|
||||||
P_DoJumpShield(player);
|
|
||||||
player->mo->momz *= 2;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Bomb shield activation
|
// Bomb shield activation
|
||||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_BOMB)
|
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_BOMB)
|
||||||
|
@ -8924,7 +8936,7 @@ void P_PlayerThink(player_t *player)
|
||||||
if (player->powers[pw_flashing] && player->powers[pw_flashing] < UINT16_MAX && ((player->pflags & PF_NIGHTSMODE) || player->powers[pw_flashing] < flashingtics))
|
if (player->powers[pw_flashing] && player->powers[pw_flashing] < UINT16_MAX && ((player->pflags & PF_NIGHTSMODE) || player->powers[pw_flashing] < flashingtics))
|
||||||
player->powers[pw_flashing]--;
|
player->powers[pw_flashing]--;
|
||||||
|
|
||||||
if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX && player->charability != CA_SWIM && !(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))) // tails fly counter
|
if (player->powers[pw_tailsfly] && player->powers[pw_tailsfly] < UINT16_MAX && player->charability != CA_SWIM) // tails fly counter
|
||||||
player->powers[pw_tailsfly]--;
|
player->powers[pw_tailsfly]--;
|
||||||
|
|
||||||
if (player->powers[pw_underwater] && (player->pflags & PF_GODMODE || (player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL))
|
if (player->powers[pw_underwater] && (player->pflags & PF_GODMODE || (player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL))
|
||||||
|
|
Loading…
Reference in a new issue