Merge branch 'ring-fix' into 'next'

Make Only Missiles with MF2_FIRING Give Rings to Teammates | Allow MT_SPINFIRE to Deal Damage to Players Outside of Ringslinger (Resolves #164)

Closes #164

See merge request STJr/SRB2!2002
This commit is contained in:
SMS Alfredo 2025-03-21 19:04:20 +00:00
commit 9160ed969d
4 changed files with 33 additions and 33 deletions

View file

@ -3237,6 +3237,11 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (inflictor->flags2 & MF2_FIRING)
P_GivePlayerRings(player, 1);
if (inflictor->flags2 & MF2_BOUNCERING)
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
return false;
}
@ -3252,10 +3257,11 @@ static boolean P_TagDamage(mobj_t *target, mobj_t *inflictor, mobj_t *source, IN
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (!(inflictor->flags & MF_FIRE))
else if (inflictor->flags2 & MF2_FIRING)
P_GivePlayerRings(player, 1);
if (inflictor->flags2 & MF2_BOUNCERING)
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
return false;
}
@ -3337,6 +3343,11 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (inflictor->flags2 & MF2_FIRING)
P_GivePlayerRings(target->player, 1);
if (inflictor->flags2 & MF2_BOUNCERING)
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
return false;
}
}
@ -3360,7 +3371,7 @@ static boolean P_PlayerHitsPlayer(mobj_t *target, mobj_t *inflictor, mobj_t *sou
S_StartSound(target, mobjinfo[MT_PITY_ICON].seesound);
}
}
else if (!(inflictor->flags & MF_FIRE))
else if (inflictor->flags2 & MF2_FIRING)
P_GivePlayerRings(target->player, 1);
if (inflictor->flags2 & MF2_BOUNCERING)
inflictor->fuse = 0; // bounce ring disappears at -1 not 0
@ -3814,14 +3825,9 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
return true;
}
if (!force && inflictor && inflictor->flags & MF_FIRE && !(damagetype && damagetype != DMG_FIRE))
{
if (player->powers[pw_shield] & SH_PROTECTFIRE)
return false; // Invincible to fire objects
if (G_PlatformGametype() && inflictor && source && source->player)
return false; // Don't get hurt by fire generated from friends.
}
if (!force && inflictor && inflictor->flags & MF_FIRE && !(damagetype && damagetype != DMG_FIRE)
&& (player->powers[pw_shield] & SH_PROTECTFIRE))
return false; // Invincible to fire objects
// Player hits another player
if (!force && source && source->player)

View file

@ -953,7 +953,8 @@ void P_ExplodeMissile(mobj_t *mo)
}
}
mo->flags &= ~MF_MISSILE;
mo->flags &= ~MF_MISSILE; // You're not a missile anymore!
mo->flags2 &= ~MF2_FIRING; // Make sure we don't trigger the non-missile behavior of MF2_FIRING
mo->flags |= MF_NOGRAVITY; // Dead missiles don't need to sink anymore.
mo->flags |= MF_NOCLIPTHING; // Dummy flag to indicate that this was already called.
@ -1821,11 +1822,6 @@ void P_XYMovement(mobj_t *mo)
}
}
}
else if (mo->type == MT_SPINFIRE)
{
P_RemoveMobj(mo);
return;
}
else if (mo->flags & MF_MISSILE)
{
// explode a missile
@ -9875,10 +9871,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
static void P_FiringThink(mobj_t *mobj)
{
if (!mobj->target)
return;
if (mobj->health <= 0)
if (!mobj->target || mobj->health <= 0 || mobj->flags & MF_MISSILE
|| mobj->extravalue1 <= 0 || mobj->extravalue1 >= NUMMOBJTYPES)
return;
if (mobj->state->action.acp1 == (actionf_p1)A_Boss1Laser)

View file

@ -181,7 +181,7 @@ typedef enum
MF2_DEBRIS = 1<<14, // Splash ring from explosion ring
MF2_NIGHTSPULL = 1<<15, // Attracted from a paraloop
MF2_JUSTATTACKED = 1<<16, // can be pushed by other moving mobjs
MF2_FIRING = 1<<17, // turret fire
MF2_FIRING = 1<<17, // Fire projectiles at your target. Or, if mobj has MF_MISSILE, this is an indicator for being a thrown ring.
MF2_SUPERFIRE = 1<<18, // Firing something with Super Sonic-stopping properties. Or, if mobj has MF_MISSILE, this is the actual fire from it.
MF2_SHADOW = 1<<19, // Fuzzy draw, makes targeting harder.
MF2_STRONGBOX = 1<<20, // Flag used for "strong" random monitors.

View file

@ -4234,7 +4234,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
P_DrainWeaponAmmo(player, pw_bouncering);
P_SetWeaponDelay(player, TICRATE/4);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNBOUNCE, MF2_BOUNCERING);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNBOUNCE, MF2_BOUNCERING|MF2_FIRING);
if (mo)
mo->fuse = 3*TICRATE; // Bounce Ring time
@ -4245,7 +4245,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
P_DrainWeaponAmmo(player, pw_railring);
P_SetWeaponDelay(player, (3*TICRATE)/2);
mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW);
mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_RAILRING|MF2_DONTDRAW|MF2_FIRING);
// Rail has no unique thrown object, therefore its sound plays here.
S_StartSound(player->mo, sfx_rail1);
@ -4257,7 +4257,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
player->pflags &= ~PF_ATTACKDOWN;
P_SetWeaponDelay(player, 2);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNAUTOMATIC, MF2_AUTOMATIC|MF2_FIRING);
}
// Explosion
else if (player->currentweapon == WEP_EXPLODE && player->powers[pw_explosionring])
@ -4265,7 +4265,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
P_DrainWeaponAmmo(player, pw_explosionring);
P_SetWeaponDelay(player, (3*TICRATE)/2);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNEXPLOSION, MF2_EXPLOSION|MF2_FIRING);
}
// Grenade
else if (player->currentweapon == WEP_GRENADE && player->powers[pw_grenadering])
@ -4273,7 +4273,7 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
P_DrainWeaponAmmo(player, pw_grenadering);
P_SetWeaponDelay(player, TICRATE/3);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNGRENADE, MF2_EXPLOSION);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNGRENADE, MF2_EXPLOSION|MF2_FIRING);
if (mo)
{
@ -4293,25 +4293,25 @@ static void P_DoFiring(player_t *player, ticcmd_t *cmd)
P_SetWeaponDelay(player, (2*TICRATE)/3);
// Center
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNSCATTER, MF2_SCATTER);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNSCATTER, MF2_SCATTER|MF2_FIRING);
if (mo)
shotangle = R_PointToAngle2(player->mo->x, player->mo->y, mo->x, mo->y);
// Left
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle-ANG2, true, MF2_SCATTER);
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle-ANG2, true, MF2_SCATTER|MF2_FIRING);
// Right
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle+ANG2, true, MF2_SCATTER);
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle+ANG2, true, MF2_SCATTER|MF2_FIRING);
// Down
player->mo->z += FixedMul(12*FRACUNIT, player->mo->scale);
player->aiming += ANG1;
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER);
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER|MF2_FIRING);
// Up
player->mo->z -= FixedMul(24*FRACUNIT, player->mo->scale);
player->aiming -= ANG2;
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER);
mo = P_SPMAngle(player->mo, MT_THROWNSCATTER, shotangle, true, MF2_SCATTER|MF2_FIRING);
player->mo->z = oldz;
player->aiming = oldaiming;
@ -4331,7 +4331,7 @@ firenormal:
{
P_SetWeaponDelay(player, TICRATE/4);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNINFINITY, 0);
mo = P_SpawnPlayerMissile(player->mo, MT_THROWNINFINITY, MF2_FIRING);
player->powers[pw_infinityring]--;
}
@ -4342,7 +4342,7 @@ firenormal:
return;
P_SetWeaponDelay(player, TICRATE/4);
mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, 0);
mo = P_SpawnPlayerMissile(player->mo, MT_REDRING, MF2_FIRING);
if (mo)
P_ColorTeamMissile(mo, player);