From 6d357b84b47eb797ff340c07bcbd1469ad4f26f0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Sep 2009 15:55:57 +0000 Subject: [PATCH] - Added Gez's A_Blast submission. SVN r1886 (trunk) --- docs/rh-log.txt | 3 + src/g_hexen/a_blastradius.cpp | 240 ++++++++---------- wadsrc/static/actors/actor.txt | 1 + wadsrc/static/actors/constants.txt | 13 + wadsrc/static/actors/hexen/blastradius.txt | 4 +- wadsrc/static/actors/{doom => shared}/dog.txt | 25 +- wadsrc/static/decorate.txt | 2 +- 7 files changed, 142 insertions(+), 146 deletions(-) rename wadsrc/static/actors/{doom => shared}/dog.txt (56%) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index b6b563dc2..a631d1213 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,6 @@ +September 28, 2009 (Changes by Graf Zahl) +- Added Gez's A_Blast submission. + September 27, 2009 (Changes by Graf Zahl) - Fixed: Floor and ceiling huggers' velocity was wrong when used with P_SpawnPlayerMissile. diff --git a/src/g_hexen/a_blastradius.cpp b/src/g_hexen/a_blastradius.cpp index bbc9af2d2..6e3b0052b 100644 --- a/src/g_hexen/a_blastradius.cpp +++ b/src/g_hexen/a_blastradius.cpp @@ -8,87 +8,21 @@ #include "s_sound.h" */ +/* For reference, the default values: #define BLAST_RADIUS_DIST 255*FRACUNIT #define BLAST_SPEED 20*FRACUNIT #define BLAST_FULLSTRENGTH 255 +*/ // Disc of Repulsion -------------------------------------------------------- -class AArtiBlastRadius : public AInventory -{ - DECLARE_CLASS (AArtiBlastRadius, AInventory) -public: - bool Use (bool pickup); -protected: - void BlastActor (AActor *victim, fixed_t strength); -}; - -IMPLEMENT_CLASS (AArtiBlastRadius) - -//========================================================================== -// -// AArtiBlastRadius :: Activate -// -// Blast all actors away -// -//========================================================================== - -bool AArtiBlastRadius::Use (bool pickup) -{ - AActor *mo; - TThinkerIterator iterator; - fixed_t dist; - - S_Sound (Owner, CHAN_AUTO, "BlastRadius", 1, ATTN_NORM); - P_NoiseAlert (Owner, Owner); - - while ( (mo = iterator.Next ()) ) - { - if ((mo == Owner) || (mo->flags2 & MF2_BOSS)) - { // Not a valid monster - continue; - } - if ((mo->flags & MF_ICECORPSE) || (mo->flags3 & MF3_CANBLAST)) - { - // Let these special cases go - } - else if ((mo->flags3 & MF3_ISMONSTER) && (mo->health <= 0)) - { - continue; - } - else if (!(mo->flags3 & MF3_ISMONSTER) && - !(mo->player) && - !(mo->flags & MF_MISSILE) && - !(mo->flags3 & MF3_CANBLAST) && - !(mo->flags6 & MF6_TOUCHY)) - { // Must be monster, player, missile, or touchy - continue; - } - if (mo->flags2 & MF2_DORMANT) - { - continue; // no dormant creatures - } - if (mo->flags3 & MF3_DONTBLAST) - { // A few things that would normally be blastable should not be blasted - continue; - } - dist = P_AproxDistance (Owner->x - mo->x, Owner->y - mo->y); - if (dist > BLAST_RADIUS_DIST) - { // Out of range - continue; - } - BlastActor (mo, BLAST_FULLSTRENGTH); - } - return true; -} - //========================================================================== // // AArtiBlastRadius :: BlastActor // //========================================================================== -void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength) +void BlastActor (AActor *victim, fixed_t strength, fixed_t speed, AActor * Owner, const PClass * blasteffect) { angle_t angle,ang; AActor *mo; @@ -101,72 +35,116 @@ void AArtiBlastRadius::BlastActor (AActor *victim, fixed_t strength) angle = R_PointToAngle2 (Owner->x, Owner->y, victim->x, victim->y); angle >>= ANGLETOFINESHIFT; - if (strength < BLAST_FULLSTRENGTH) + victim->velx = FixedMul (speed, finecosine[angle]); + victim->vely = FixedMul (speed, finesine[angle]); + + // Spawn blast puff + ang = R_PointToAngle2 (victim->x, victim->y, Owner->x, Owner->y); + ang >>= ANGLETOFINESHIFT; + x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]); + y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]); + z = victim->z - victim->floorclip + (victim->height>>1); + mo = Spawn (blasteffect, x, y, z, ALLOW_REPLACE); + if (mo) { - victim->velx = FixedMul (strength, finecosine[angle]); - victim->vely = FixedMul (strength, finesine[angle]); - if (victim->player) + mo->velx = victim->velx; + mo->vely = victim->vely; + } + if (victim->flags & MF_MISSILE) + { + // [RH] Floor and ceiling huggers should not be blasted vertically. + if (!(victim->flags3 & (MF3_FLOORHUGGER|MF3_CEILINGHUGGER))) { - // Players handled automatically - } - else - { - victim->flags2 |= MF2_BLASTED; + victim->velz = 8*FRACUNIT; + mo->velz = victim->velz; } } - else // full strength blast from artifact + else { - if (victim->flags & MF_MISSILE) - { -#if 0 - if (victim->IsKindOf (RUNTIME_CLASS(AMageStaffFX2))) - { // Reflect to originator - victim->special1 = (int)victim->target; - victim->target = Owner; - } -#endif - } - victim->velx = FixedMul (BLAST_SPEED, finecosine[angle]); - victim->vely = FixedMul (BLAST_SPEED, finesine[angle]); - - // Spawn blast puff - ang = R_PointToAngle2 (victim->x, victim->y, Owner->x, Owner->y); - ang >>= ANGLETOFINESHIFT; - x = victim->x + FixedMul (victim->radius+FRACUNIT, finecosine[ang]); - y = victim->y + FixedMul (victim->radius+FRACUNIT, finesine[ang]); - z = victim->z - victim->floorclip + (victim->height>>1); - mo = Spawn ("BlastEffect", x, y, z, ALLOW_REPLACE); - if (mo) - { - mo->velx = victim->velx; - mo->vely = victim->vely; - } - - if (victim->flags & MF_MISSILE) - { - // [RH] Floor and ceiling huggers should not be blasted vertically. - if (!(victim->flags3 & (MF3_FLOORHUGGER|MF3_CEILINGHUGGER))) - { - victim->velz = 8*FRACUNIT; - mo->velz = victim->velz; - } - } - else - { - victim->velz = (1000 / victim->Mass) << FRACBITS; - } - if (victim->player) - { - // Players handled automatically - } - else - { - victim->flags2 |= MF2_BLASTED; - } - if (victim->flags6 & MF6_TOUCHY) - { // Touchy objects die when blasted - victim->flags6 &= ~MF6_ARMED; // Disarm - P_DamageMobj(victim, Owner, Owner, victim->health, NAME_Melee, DMG_FORCED); - } + victim->velz = (1000 / victim->Mass) << FRACBITS; + } + if (victim->player) + { + // Players handled automatically + } + else + { + victim->flags2 |= MF2_BLASTED; + } + if (victim->flags6 & MF6_TOUCHY) + { // Touchy objects die when blasted + victim->flags6 &= ~MF6_ARMED; // Disarm + P_DamageMobj(victim, Owner, Owner, victim->health, NAME_Melee, DMG_FORCED); + } +} + +enum +{ + BF_USEAMMO = 1, + BF_DONTWARN = 2, + BF_AFFECTBOSSES = 4, +}; + +//========================================================================== +// +// AArtiBlastRadius :: Activate +// +// Blast all actors away +// +//========================================================================== + +DEFINE_ACTION_FUNCTION_PARAMS (AActor, A_Blast) +{ + ACTION_PARAM_START(6); + ACTION_PARAM_INT (blastflags, 0); + ACTION_PARAM_FIXED(strength, 1); + ACTION_PARAM_FIXED(radius, 2); + ACTION_PARAM_FIXED(speed, 3); + ACTION_PARAM_CLASS(blasteffect, 4); + ACTION_PARAM_SOUND(blastsound, 5); + + AActor *mo; + TThinkerIterator iterator; + fixed_t dist; + + if (self->player && (blastflags & BF_USEAMMO)) + { + AWeapon * weapon = self->player->ReadyWeapon; + if (!weapon->DepleteAmmo(weapon->bAltFire)) + return; + } + + S_Sound (self, CHAN_AUTO, blastsound, 1, ATTN_NORM); + + if (!(blastflags & BF_DONTWARN)) P_NoiseAlert (self, self); + + while ( (mo = iterator.Next ()) ) + { + if ((mo == self) || ((mo->flags2 & MF2_BOSS) && !(blastflags & BF_AFFECTBOSSES)) + || (mo->flags2 & MF2_DORMANT) || (mo->flags3 & MF3_DONTBLAST)) + { // Not a valid monster: originator, boss, dormant, or otherwise protected + continue; + } + if ((mo->flags & MF_ICECORPSE) || (mo->flags3 & MF3_CANBLAST)) + { + // Let these special cases go + } + else if ((mo->flags3 & MF3_ISMONSTER) && (mo->health <= 0)) + { + continue; + } + else if (!(mo->player) && + !(mo->flags & MF_MISSILE) && + !(mo->flags3 & (MF3_ISMONSTER|MF3_CANBLAST)) && + !(mo->flags6 & (MF6_TOUCHY|MF6_VULNERABLE))) + { // Must be monster, player, missile, touchy or vulnerable + continue; + } + dist = P_AproxDistance (self->x - mo->x, self->y - mo->y); + if (dist > radius) + { // Out of range + continue; + } + BlastActor (mo, strength, speed, self, blasteffect); } } diff --git a/wadsrc/static/actors/actor.txt b/wadsrc/static/actors/actor.txt index b644b3511..429038de2 100644 --- a/wadsrc/static/actors/actor.txt +++ b/wadsrc/static/actors/actor.txt @@ -227,6 +227,7 @@ ACTOR Actor native //: Thinker action native A_CustomMeleeAttack(int damage = 0, sound meleesound = "", sound misssound = "", name damagetype = "none", bool bleed = true); action native A_CustomComboAttack(class missiletype, float spawnheight, int damage, sound meleesound = "", name damagetype = "none", bool bleed = true); action native A_Burst(class chunktype); + action native A_Blast(int flags = 0, int strength = 255, int radius = 255, float speed = 20, class blasteffect = "BlastEffect", sound blastsound = "BlastRadius"); action native A_RadiusThrust(int force = 128, int distance = -1, bool affectsource = true); action native A_Explode(int damage = -1, int distance = -1, bool hurtsource = true, bool alert = false, int fulldamagedistance = 0, int nails = 0, int naildamage = 10); action native A_Stop(); diff --git a/wadsrc/static/actors/constants.txt b/wadsrc/static/actors/constants.txt index 4761152be..a3b619a0c 100644 --- a/wadsrc/static/actors/constants.txt +++ b/wadsrc/static/actors/constants.txt @@ -71,6 +71,11 @@ const int RGF_NOPIERCING = 2; const int MSF_Standard = 0; const int MSF_Classic = 1; +// Flags for A_Blast +const int BF_USEAMMO = 1; +const int BF_DONTWARN = 2; +const int BF_AFFECTBOSSES = 4; + // Activation flags enum { @@ -82,6 +87,14 @@ enum THINGSPEC_MissileTrigger = 16, THINGSPEC_ClearSpecial = 32, }; +// Shorter aliases for same +const int AF_Default = 0; +const int AF_ThingActs = 1; +const int AF_ThingTargets = 2; +const int AF_TriggerTargets = 4; +const int AF_MonsterTrigger = 8; +const int AF_MissileTrigger = 16; +const int AF_ClearSpecial = 32; // constants for A_PlaySound enum diff --git a/wadsrc/static/actors/hexen/blastradius.txt b/wadsrc/static/actors/hexen/blastradius.txt index 5c5e05613..7e4259cf8 100644 --- a/wadsrc/static/actors/hexen/blastradius.txt +++ b/wadsrc/static/actors/hexen/blastradius.txt @@ -1,5 +1,5 @@ -ACTOR ArtiBlastRadius : Inventory 10110 native +ACTOR ArtiBlastRadius : CustomInventory 10110 { Game Hexen SpawnID 74 @@ -15,6 +15,8 @@ ACTOR ArtiBlastRadius : Inventory 10110 native Spawn: BLST ABCDEFGH 4 Bright Loop + Use: + TNT1 A 0 A_Blast } } diff --git a/wadsrc/static/actors/doom/dog.txt b/wadsrc/static/actors/shared/dog.txt similarity index 56% rename from wadsrc/static/actors/doom/dog.txt rename to wadsrc/static/actors/shared/dog.txt index 0feb393f5..439060d41 100644 --- a/wadsrc/static/actors/doom/dog.txt +++ b/wadsrc/static/actors/shared/dog.txt @@ -1,20 +1,19 @@ ACTOR MBFHelperDog 888 { - Game Doom Health 500 - Speed 10 + Speed 10 PainChance 180 - Radius 12 - Height 28 - Mass 100 - Monster - +JUMPDOWN - ActiveSound "dog/active" - AttackSound "dog/attack" - DeathSound "dog/death" - PainSound "dog/pain" - SeeSound "dog/sight" - Obituary "$OB_DOG" + Radius 12 + Height 28 + Mass 100 + Monster + +JUMPDOWN + ActiveSound "dog/active" + AttackSound "dog/attack" + DeathSound "dog/death" + PainSound "dog/pain" + SeeSound "dog/sight" + Obituary "$OB_DOG" States { Spawn: diff --git a/wadsrc/static/decorate.txt b/wadsrc/static/decorate.txt index ba3bf4b7e..465ce3287 100644 --- a/wadsrc/static/decorate.txt +++ b/wadsrc/static/decorate.txt @@ -28,6 +28,7 @@ #include "actors/shared/setcolor.txt" #include "actors/shared/sectoraction.txt" #include "actors/shared/action.txt" +#include "actors/shared/dog.txt" #include "actors/doom/doomplayer.txt" #include "actors/doom/possessed.txt" @@ -45,7 +46,6 @@ #include "actors/doom/spidermaster.txt" #include "actors/doom/keen.txt" #include "actors/doom/bossbrain.txt" -#include "actors/doom/dog.txt" #include "actors/doom/deadthings.txt" #include "actors/doom/doomammo.txt"