mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-01-17 23:21:22 +00:00
Merge branch 'match-rebalancing' into damage-control
Conflicts: src/p_inter.c src/p_user.c src/st_stuff.c
This commit is contained in:
commit
ba77b235d1
9 changed files with 266 additions and 124 deletions
|
@ -86,6 +86,7 @@ UINT8 modeattacking = ATTACKING_NONE;
|
|||
boolean disableSpeedAdjust = false;
|
||||
boolean imcontinuing = false;
|
||||
boolean runemeraldmanager = false;
|
||||
UINT16 emeraldspawndelay = 60*TICRATE;
|
||||
|
||||
// menu demo things
|
||||
UINT8 numDemos = 3;
|
||||
|
|
|
@ -554,6 +554,17 @@ static int lib_pAddPlayerScore(lua_State *L)
|
|||
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)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
|
@ -1093,6 +1104,16 @@ static int lib_pPlayerWeaponAmmoBurst(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int lib_pPlayerWeaponPanelOrAmmoBurst(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
NOHUD
|
||||
if (!player)
|
||||
return LUA_ErrInvalid(L, "player_t");
|
||||
P_PlayerWeaponPanelOrAmmoBurst(player);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lib_pPlayerEmeraldBurst(lua_State *L)
|
||||
{
|
||||
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
|
||||
|
@ -1200,6 +1221,16 @@ static int lib_pDoNightsScore(lua_State *L)
|
|||
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
|
||||
////////////
|
||||
|
||||
|
@ -1907,6 +1938,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_GetPlayerSpinHeight",lib_pGetPlayerSpinHeight},
|
||||
{"P_GetPlayerControlDirection",lib_pGetPlayerControlDirection},
|
||||
{"P_AddPlayerScore",lib_pAddPlayerScore},
|
||||
{"P_StealPlayerScore",lib_pStealPlayerScore},
|
||||
{"P_PlayerInPain",lib_pPlayerInPain},
|
||||
{"P_DoPlayerPain",lib_pDoPlayerPain},
|
||||
{"P_ResetPlayer",lib_pResetPlayer},
|
||||
|
@ -1957,6 +1989,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_PlayerRingBurst",lib_pPlayerRingBurst},
|
||||
{"P_PlayerWeaponPanelBurst",lib_pPlayerWeaponPanelBurst},
|
||||
{"P_PlayerWeaponAmmoBurst",lib_pPlayerWeaponAmmoBurst},
|
||||
{"P_PlayerWeaponPanelOrAmmoBurst", lib_pPlayerWeaponPanelOrAmmoBurst},
|
||||
{"P_PlayerEmeraldBurst",lib_pPlayerEmeraldBurst},
|
||||
{"P_PlayerFlagBurst",lib_pPlayerFlagBurst},
|
||||
{"P_PlayRinglossSound",lib_pPlayRinglossSound},
|
||||
|
@ -1965,6 +1998,7 @@ static luaL_Reg lib[] = {
|
|||
{"P_PlayLivesJingle",lib_pPlayLivesJingle},
|
||||
{"P_CanPickupItem",lib_pCanPickupItem},
|
||||
{"P_DoNightsScore",lib_pDoNightsScore},
|
||||
{"P_DoMatchSuper",lib_pDoMatchSuper},
|
||||
|
||||
// p_spec
|
||||
{"P_Thrust",lib_pThrust},
|
||||
|
|
197
src/p_inter.c
197
src/p_inter.c
|
@ -217,6 +217,73 @@ void P_DoNightsScore(player_t *player)
|
|||
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"!
|
||||
emeraldspawndelay = invulntics + 1;
|
||||
player->powers[pw_emeralds] = 0;
|
||||
player->powers[pw_invulnerability] = emeraldspawndelay;
|
||||
player->powers[pw_sneakers] = emeraldspawndelay;
|
||||
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.
|
||||
* Actually, this just checks a few things (heights, toucher->player, no
|
||||
* objectplace, no dead or disappearing things)
|
||||
|
@ -437,7 +504,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
{
|
||||
INT32 pindex = special->info->mass - (INT32)pw_infinityring;
|
||||
|
||||
player->powers[special->info->mass] += (UINT16)special->info->reactiontime;
|
||||
player->powers[special->info->mass] += (UINT16)special->reactiontime;
|
||||
player->ringweapons |= 1 << (pindex-1);
|
||||
|
||||
if (player->powers[special->info->mass] > rw_maximums[pindex])
|
||||
|
@ -524,7 +591,10 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
|
||||
if (special->threshold)
|
||||
{
|
||||
player->powers[pw_emeralds] |= special->info->speed;
|
||||
P_DoMatchSuper(player);
|
||||
}
|
||||
else
|
||||
emeralds |= special->info->speed;
|
||||
|
||||
|
@ -545,6 +615,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
return;
|
||||
|
||||
player->powers[pw_emeralds] |= special->threshold;
|
||||
P_DoMatchSuper(player);
|
||||
break;
|
||||
|
||||
// Secret emblem thingy
|
||||
|
@ -1354,7 +1425,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck)
|
|||
}
|
||||
|
||||
if (player->powers[pw_invulnerability] || player->powers[pw_flashing]
|
||||
|| (player->powers[pw_super] && !(ALL7EMERALDS(player->powers[pw_emeralds]))))
|
||||
|| player->powers[pw_super])
|
||||
return;
|
||||
if (player->powers[pw_shield] || player->bot) //If One-Hit Shield
|
||||
{
|
||||
|
@ -2439,15 +2510,7 @@ static inline boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *sou
|
|||
P_PlayVictorySound(source); // Killer laughs at you! LAUGHS! BWAHAHAHHAHAA!!
|
||||
}
|
||||
|
||||
if (inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]))
|
||||
{
|
||||
player->rings -= 10;
|
||||
if (player->rings < 1)
|
||||
player->rings = 1;
|
||||
}
|
||||
else
|
||||
player->rings = 0;
|
||||
|
||||
player->rings = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2658,15 +2721,12 @@ 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)
|
||||
{
|
||||
if (!(inflictor && ((inflictor->flags & MF_MISSILE) || inflictor->player) && player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
||||
{
|
||||
P_DoPlayerPain(player, source, inflictor);
|
||||
P_DoPlayerPain(player, source, inflictor);
|
||||
|
||||
P_ForceFeed(player, 40, 10, TICRATE, 40 + min(damage, 100)*2);
|
||||
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->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
|
||||
{
|
||||
|
@ -2917,7 +2977,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
|
||||
|| (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)
|
||||
&& (inflictor->flags2 & MF2_SUPERFIRE)
|
||||
|
@ -2964,25 +3024,8 @@ 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 (player->powers[pw_shield])
|
||||
{
|
||||
P_RemoveShield(player);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
player->rings -= (10 * (1 << (INT32)(player->powers[pw_super] / 10500)));
|
||||
if (player->rings < 1)
|
||||
player->rings = 1;
|
||||
}
|
||||
|
||||
if (gametype == GT_CTF && (player->gotflag & (GF_REDFLAG|GF_BLUEFLAG)))
|
||||
P_PlayerFlagBurst(player, false);
|
||||
if (damagetype & DMG_DEATHMASK)
|
||||
damage = 0;
|
||||
}
|
||||
else if (damagetype & DMG_DEATHMASK)
|
||||
player->rings = 0;
|
||||
else if (damage == 0 || player->rings) //quickfix to just get things back to normal ...for now (sans Tag, I'll deal with that later)
|
||||
{
|
||||
|
@ -3022,10 +3065,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
}
|
||||
|
||||
if (player)
|
||||
{
|
||||
if (!(player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
||||
P_ResetPlayer(target->player);
|
||||
}
|
||||
P_ResetPlayer(target->player);
|
||||
else
|
||||
switch (target->type)
|
||||
{
|
||||
|
@ -3083,11 +3123,7 @@ void P_PlayerRingBurst(player_t *player, INT32 num_rings)
|
|||
P_PlayerEmeraldBurst(player, false);
|
||||
|
||||
// Spill weapons first
|
||||
if (player->ringweapons)
|
||||
P_PlayerWeaponPanelBurst(player);
|
||||
|
||||
// Spill the ammo
|
||||
P_PlayerWeaponAmmoBurst(player);
|
||||
P_PlayerWeaponPanelOrAmmoBurst(player);
|
||||
|
||||
for (i = 0; i < num_rings; i++)
|
||||
{
|
||||
|
@ -3344,6 +3380,75 @@ void P_PlayerWeaponAmmoBurst(player_t *player)
|
|||
}
|
||||
}
|
||||
|
||||
void P_PlayerWeaponPanelOrAmmoBurst(player_t *player)
|
||||
{
|
||||
mobj_t *mo;
|
||||
angle_t fa;
|
||||
fixed_t ns;
|
||||
INT32 i = 0;
|
||||
fixed_t z;
|
||||
|
||||
#define SETUP_DROP(thingtype) \
|
||||
z = player->mo->z; \
|
||||
if (player->mo->eflags & MFE_VERTICALFLIP) \
|
||||
z += player->mo->height - mobjinfo[thingtype].height; \
|
||||
fa = ((i*FINEANGLES/16) + (player->mo->angle>>ANGLETOFINESHIFT)) & FINEMASK; \
|
||||
ns = FixedMul(3*FRACUNIT, player->mo->scale); \
|
||||
|
||||
#define DROP_WEAPON(rwflag, pickup, ammo, power) \
|
||||
if (player->ringweapons & rwflag) \
|
||||
{ \
|
||||
player->ringweapons &= ~rwflag; \
|
||||
SETUP_DROP(pickup) \
|
||||
mo = P_SpawnMobj(player->mo->x, player->mo->y, z, pickup); \
|
||||
mo->reactiontime = 0; \
|
||||
mo->flags2 |= MF2_DONTRESPAWN; \
|
||||
mo->flags &= ~(MF_NOGRAVITY|MF_NOCLIPHEIGHT); \
|
||||
P_SetTarget(&mo->target, player->mo); \
|
||||
mo->fuse = 12*TICRATE; \
|
||||
mo->destscale = player->mo->scale; \
|
||||
P_SetScale(mo, player->mo->scale); \
|
||||
mo->momx = FixedMul(FINECOSINE(fa),ns); \
|
||||
if (!(twodlevel || (player->mo->flags2 & MF2_TWOD))) \
|
||||
mo->momy = FixedMul(FINESINE(fa),ns); \
|
||||
P_SetObjectMomZ(mo, 4*FRACUNIT, false); \
|
||||
if (i & 1) \
|
||||
P_SetObjectMomZ(mo, 4*FRACUNIT, true); \
|
||||
++i; \
|
||||
} \
|
||||
else if (player->powers[power] > 0) \
|
||||
{ \
|
||||
SETUP_DROP(ammo) \
|
||||
mo = P_SpawnMobj(player->mo->x, player->mo->y, z, ammo); \
|
||||
mo->health = player->powers[power]; \
|
||||
mo->flags2 |= MF2_DONTRESPAWN; \
|
||||
mo->flags &= ~(MF_NOGRAVITY|MF_NOCLIPHEIGHT); \
|
||||
P_SetTarget(&mo->target, player->mo); \
|
||||
mo->fuse = 12*TICRATE; \
|
||||
mo->destscale = player->mo->scale; \
|
||||
P_SetScale(mo, player->mo->scale); \
|
||||
mo->momx = FixedMul(FINECOSINE(fa),ns); \
|
||||
if (!(twodlevel || (player->mo->flags2 & MF2_TWOD))) \
|
||||
mo->momy = FixedMul(FINESINE(fa),ns); \
|
||||
P_SetObjectMomZ(mo, 3*FRACUNIT, false); \
|
||||
if (i & 1) \
|
||||
P_SetObjectMomZ(mo, 3*FRACUNIT, true); \
|
||||
player->powers[power] = 0; \
|
||||
++i; \
|
||||
}
|
||||
|
||||
DROP_WEAPON(RW_BOUNCE, MT_BOUNCEPICKUP, MT_BOUNCERING, pw_bouncering);
|
||||
DROP_WEAPON(RW_RAIL, MT_RAILPICKUP, MT_RAILRING, pw_railring);
|
||||
DROP_WEAPON(RW_AUTO, MT_AUTOPICKUP, MT_AUTOMATICRING, pw_automaticring);
|
||||
DROP_WEAPON(RW_EXPLODE, MT_EXPLODEPICKUP, MT_EXPLOSIONRING, pw_explosionring);
|
||||
DROP_WEAPON(RW_SCATTER, MT_SCATTERPICKUP, MT_SCATTERRING, pw_scatterring);
|
||||
DROP_WEAPON(RW_GRENADE, MT_GRENADEPICKUP, MT_GRENADERING, pw_grenadering);
|
||||
DROP_WEAPON(0, 0, MT_INFINITYRING, pw_infinityring);
|
||||
|
||||
#undef DROP_WEAPON
|
||||
#undef SETUP_DROP
|
||||
}
|
||||
|
||||
//
|
||||
// P_PlayerEmeraldBurst
|
||||
//
|
||||
|
|
|
@ -371,6 +371,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
|
|||
void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c
|
||||
void P_PlayerWeaponPanelBurst(player_t *player);
|
||||
void P_PlayerWeaponAmmoBurst(player_t *player);
|
||||
void P_PlayerWeaponPanelOrAmmoBurst(player_t *player);
|
||||
void P_PlayerEmeraldBurst(player_t *player, boolean toss);
|
||||
|
||||
void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck);
|
||||
|
@ -384,6 +385,7 @@ void P_ResetStarposts(void);
|
|||
|
||||
boolean P_CanPickupItem(player_t *player, boolean weapon);
|
||||
void P_DoNightsScore(player_t *player);
|
||||
void P_DoMatchSuper(player_t *player);
|
||||
|
||||
//
|
||||
// P_SPEC
|
||||
|
|
20
src/p_mobj.c
20
src/p_mobj.c
|
@ -782,14 +782,12 @@ void P_EmeraldManager(void)
|
|||
else
|
||||
break;
|
||||
|
||||
if (leveltime < TICRATE) // Start of map
|
||||
spawnpoints[j]->threshold = 60*TICRATE + P_Random() * (TICRATE/5);
|
||||
else
|
||||
spawnpoints[j]->threshold = P_Random() * (TICRATE/5);
|
||||
|
||||
spawnpoints[j]->threshold = emeraldspawndelay + P_Random() * (TICRATE/5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
emeraldspawndelay = 0;
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -9639,7 +9637,7 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 allowai
|
|||
{
|
||||
mobj_t *th;
|
||||
angle_t an;
|
||||
fixed_t x, y, z, slope = 0;
|
||||
fixed_t x, y, z, slope = 0, speed;
|
||||
|
||||
// angle at which you fire, is player angle
|
||||
an = angle;
|
||||
|
@ -9671,9 +9669,13 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 allowai
|
|||
|
||||
P_SetTarget(&th->target, source);
|
||||
|
||||
speed = th->info->speed;
|
||||
if (source->player && source->player->charability == CA_FLY)
|
||||
speed = FixedMul(speed, 3*FRACUNIT/2);
|
||||
|
||||
th->angle = an;
|
||||
th->momx = FixedMul(th->info->speed, FINECOSINE(an>>ANGLETOFINESHIFT));
|
||||
th->momy = FixedMul(th->info->speed, FINESINE(an>>ANGLETOFINESHIFT));
|
||||
th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT));
|
||||
th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT));
|
||||
|
||||
if (allowaim)
|
||||
{
|
||||
|
@ -9681,7 +9683,7 @@ mobj_t *P_SPMAngle(mobj_t *source, mobjtype_t type, angle_t angle, UINT8 allowai
|
|||
th->momy = FixedMul(th->momy,FINECOSINE(source->player->aiming>>ANGLETOFINESHIFT));
|
||||
}
|
||||
|
||||
th->momz = FixedMul(th->info->speed, slope);
|
||||
th->momz = FixedMul(speed, slope);
|
||||
|
||||
//scaling done here so it doesn't clutter up the code above
|
||||
th->momx = FixedMul(th->momx, th->scale);
|
||||
|
|
|
@ -446,5 +446,6 @@ void P_EmeraldManager(void);
|
|||
extern mapthing_t *huntemeralds[MAXHUNTEMERALDS];
|
||||
extern INT32 numhuntemeralds;
|
||||
extern boolean runemeraldmanager;
|
||||
extern UINT16 emeraldspawndelay;
|
||||
extern INT32 numstarposts;
|
||||
#endif
|
||||
|
|
|
@ -2015,6 +2015,7 @@ static void P_LevelInitStuff(void)
|
|||
// special stage tokens, emeralds, and ring total
|
||||
tokenbits = 0;
|
||||
runemeraldmanager = false;
|
||||
emeraldspawndelay = 60*TICRATE;
|
||||
nummaprings = 0;
|
||||
|
||||
// emerald hunt
|
||||
|
|
132
src/p_user.c
132
src/p_user.c
|
@ -987,6 +987,7 @@ void P_DoSuperTransformation(player_t *player, boolean giverings)
|
|||
|
||||
P_PlayerFlagBurst(player, false);
|
||||
}
|
||||
|
||||
// Adds to the player's score
|
||||
void P_AddPlayerScore(player_t *player, UINT32 amount)
|
||||
{
|
||||
|
@ -1073,6 +1074,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
|
||||
//
|
||||
|
@ -3120,68 +3157,61 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
mobj_t *mo = NULL;
|
||||
player->pflags |= PF_ATTACKDOWN;
|
||||
|
||||
#define TAKE_AMMO(player, power) \
|
||||
player->powers[power]--; \
|
||||
if (player->rings < 1) \
|
||||
{ \
|
||||
if (player->powers[power] > 0) \
|
||||
player->powers[power]--; \
|
||||
} \
|
||||
else \
|
||||
player->rings--;
|
||||
|
||||
if (cmd->buttons & BT_FIRENORMAL) // No powers, just a regular ring.
|
||||
goto firenormal; //code repetition sucks.
|
||||
// Bounce ring
|
||||
else if (player->currentweapon == WEP_BOUNCE && player->powers[pw_bouncering])
|
||||
{
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_bouncering);
|
||||
P_SetWeaponDelay(player, TICRATE/4);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNBOUNCE, MF2_BOUNCERING);
|
||||
|
||||
if (mo)
|
||||
mo->fuse = 3*TICRATE; // Bounce Ring time
|
||||
|
||||
player->powers[pw_bouncering]--;
|
||||
player->rings--;
|
||||
}
|
||||
// Rail ring
|
||||
else if (player->currentweapon == WEP_RAIL && player->powers[pw_railring])
|
||||
{
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_railring);
|
||||
P_SetWeaponDelay(player, (3*TICRATE)/2);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW);
|
||||
|
||||
// Rail has no unique thrown object, therefore its sound plays here.
|
||||
S_StartSound(player->mo, sfx_rail1);
|
||||
|
||||
player->powers[pw_railring]--;
|
||||
player->rings--;
|
||||
}
|
||||
// Automatic
|
||||
else if (player->currentweapon == WEP_AUTO && player->powers[pw_automaticring])
|
||||
{
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_automaticring);
|
||||
player->pflags &= ~PF_ATTACKDOWN;
|
||||
P_SetWeaponDelay(player, 2);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC);
|
||||
|
||||
player->powers[pw_automaticring]--;
|
||||
player->rings--;
|
||||
}
|
||||
// Explosion
|
||||
else if (player->currentweapon == WEP_EXPLODE && player->powers[pw_explosionring])
|
||||
{
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_explosionring);
|
||||
P_SetWeaponDelay(player, (3*TICRATE)/2);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION);
|
||||
|
||||
player->powers[pw_explosionring]--;
|
||||
player->rings--;
|
||||
}
|
||||
// Grenade
|
||||
else if (player->currentweapon == WEP_GRENADE && player->powers[pw_grenadering])
|
||||
{
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_grenadering);
|
||||
P_SetWeaponDelay(player, TICRATE/3);
|
||||
|
||||
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNGRENADE, MF2_EXPLOSION);
|
||||
|
@ -3191,9 +3221,6 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
//P_InstaThrust(mo, player->mo->angle, FixedMul(mo->info->speed, player->mo->scale));
|
||||
mo->fuse = mo->info->mass;
|
||||
}
|
||||
|
||||
player->powers[pw_grenadering]--;
|
||||
player->rings--;
|
||||
}
|
||||
// Scatter
|
||||
// Note: Ignores MF2_RAILRING
|
||||
|
@ -3203,8 +3230,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
angle_t shotangle = player->mo->angle;
|
||||
angle_t oldaiming = player->aiming;
|
||||
|
||||
if (player->rings <= 0)
|
||||
return;
|
||||
TAKE_AMMO(player, pw_scatterring);
|
||||
P_SetWeaponDelay(player, (2*TICRATE)/3);
|
||||
|
||||
// Center
|
||||
|
@ -3230,9 +3256,6 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
|
|||
|
||||
player->mo->z = oldz;
|
||||
player->aiming = oldaiming;
|
||||
|
||||
player->powers[pw_scatterring]--;
|
||||
player->rings--;
|
||||
return;
|
||||
}
|
||||
// No powers, just a regular ring.
|
||||
|
@ -3269,6 +3292,8 @@ firenormal:
|
|||
}
|
||||
}
|
||||
|
||||
#undef TAKE_AMMO
|
||||
|
||||
if (mo)
|
||||
{
|
||||
if (mo->flags & MF_MISSILE && mo->flags2 & MF2_RAILRING)
|
||||
|
@ -3319,7 +3344,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
return; // NiGHTS Super doesn't mix with normal super
|
||||
|
||||
// Does player have all emeralds? If so, flag the "Ready For Super!"
|
||||
if ((ALL7EMERALDS(emeralds) || ALL7EMERALDS(player->powers[pw_emeralds])) && player->rings >= 50)
|
||||
if (ALL7EMERALDS(emeralds) && player->rings >= 50)
|
||||
player->pflags |= PF_SUPERREADY;
|
||||
else
|
||||
player->pflags &= ~PF_SUPERREADY;
|
||||
|
@ -3327,7 +3352,7 @@ static void P_DoSuperStuff(player_t *player)
|
|||
if (player->powers[pw_super])
|
||||
{
|
||||
// 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;
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_STND);
|
||||
|
@ -3472,12 +3497,12 @@ static void P_DoSuperStuff(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_invulnerability]
|
||||
&& !(maptol & TOL_NIGHTS) // don't turn 'regular super' in nights levels
|
||||
&& player->pflags & PF_JUMPED
|
||||
&& ((player->charflags & SF_SUPER) || ALL7EMERALDS(player->powers[pw_emeralds])))
|
||||
&& player->charflags & SF_SUPER)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -4022,13 +4047,6 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
|||
player->pflags |= PF_GLIDING|PF_THOKKED;
|
||||
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_InstaThrust(player->mo, player->mo->angle, FixedMul(glidespeed, player->mo->scale));
|
||||
player->pflags &= ~(PF_SPINNING|PF_STARTDASH);
|
||||
|
@ -4142,8 +4160,7 @@ static void P_DoJumpStuff(player_t *player, ticcmd_t *cmd)
|
|||
player->pflags &= ~PF_JUMPDOWN;
|
||||
|
||||
// Repeat abilities, but not double jump!
|
||||
if ((player->charability2 == CA2_MULTIABILITY && player->charability != CA_DOUBLEJUMP)
|
||||
|| (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])))
|
||||
if (player->charability2 == CA2_MULTIABILITY && player->charability != CA_DOUBLEJUMP)
|
||||
player->secondjump = 0;
|
||||
else if (player->charability == CA_FLOAT && player->secondjump == 1)
|
||||
player->secondjump = 2;
|
||||
|
@ -4387,9 +4404,6 @@ static void P_2dMovement(player_t *player)
|
|||
if (cmd->forwardmove != 0)
|
||||
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;
|
||||
}
|
||||
else if (cmd->sidemove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
||||
|
@ -4583,11 +4597,7 @@ static void P_3dMovement(player_t *player)
|
|||
if (player->climbing)
|
||||
{
|
||||
if (cmd->forwardmove)
|
||||
{
|
||||
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
|
||||
&& cmd->forwardmove != 0 && !(player->pflags & PF_GLIDING || player->exiting
|
||||
|
@ -4628,12 +4638,7 @@ static void P_3dMovement(player_t *player)
|
|||
}
|
||||
// Sideways movement
|
||||
if (player->climbing)
|
||||
{
|
||||
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));
|
||||
}
|
||||
P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 10*FRACUNIT), player->mo->scale));
|
||||
// Analog movement control
|
||||
else if (analogmove)
|
||||
{
|
||||
|
@ -6543,8 +6548,8 @@ static void P_MovePlayer(player_t *player)
|
|||
P_ResetPlayer(player); // down, stop gliding.
|
||||
if (onground)
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_WALK);
|
||||
else if ((player->charability2 == CA2_MULTIABILITY)
|
||||
|| (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds]) && player->charability == CA_GLIDEANDCLIMB))
|
||||
else if (player->charability2 == CA2_MULTIABILITY
|
||||
&& player->charability == CA_GLIDEANDCLIMB)
|
||||
{
|
||||
player->pflags |= PF_JUMPED;
|
||||
P_SetPlayerMobjState(player->mo, S_PLAY_SPIN);
|
||||
|
@ -6797,11 +6802,6 @@ static void P_MovePlayer(player_t *player)
|
|||
{
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_JUMP && !player->powers[pw_super])
|
||||
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
|
||||
if ((player->powers[pw_shield] & SH_NOSTACK) == SH_BOMB)
|
||||
|
@ -8957,7 +8957,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))
|
||||
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]--;
|
||||
|
||||
if (player->powers[pw_underwater] && (player->pflags & PF_GODMODE || (player->powers[pw_shield] & SH_NOSTACK) == SH_ELEMENTAL))
|
||||
|
@ -9240,10 +9240,6 @@ void P_PlayerAfterThink(player_t *player)
|
|||
if (player->currentweapon == WEP_RAIL && (!(player->ringweapons & RW_RAIL) || !player->powers[pw_railring]))
|
||||
player->currentweapon = 0;
|
||||
|
||||
// If you're out of rings, but have Infinity Rings left, switch to that.
|
||||
if (player->currentweapon != 0 && player->rings <= 0 && player->powers[pw_infinityring])
|
||||
player->currentweapon = 0;
|
||||
|
||||
if (P_IsLocalPlayer(player) && (player->pflags & PF_WPNDOWN) && player->currentweapon != oldweapon)
|
||||
S_StartSound(NULL, sfx_wepchg);
|
||||
|
||||
|
|
|
@ -1349,7 +1349,7 @@ static void ST_drawWeaponRing(powertype_t weapon, INT32 rwflag, INT32 wepflag, I
|
|||
txtflags |= V_YELLOWMAP;
|
||||
|
||||
if (weapon == pw_infinityring
|
||||
|| (stplyr->ringweapons & rwflag && stplyr->rings > 0))
|
||||
|| (stplyr->ringweapons & rwflag))
|
||||
txtflags |= V_20TRANS;
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue