mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-11-24 21:11:39 +00:00
- scriptified the Phoenix Rod, completing the Heretic weapons.
This commit is contained in:
parent
53ff7f0c73
commit
4f370ba181
10 changed files with 372 additions and 473 deletions
|
@ -858,7 +858,6 @@ set( NOT_COMPILED_SOURCE_FILES
|
||||||
sc_man_scanner.h
|
sc_man_scanner.h
|
||||||
sc_man_scanner.re
|
sc_man_scanner.re
|
||||||
g_heretic/a_hereticartifacts.cpp
|
g_heretic/a_hereticartifacts.cpp
|
||||||
g_heretic/a_hereticweaps.cpp
|
|
||||||
g_hexen/a_blastradius.cpp
|
g_hexen/a_blastradius.cpp
|
||||||
g_hexen/a_boostarmor.cpp
|
g_hexen/a_boostarmor.cpp
|
||||||
g_hexen/a_clericflame.cpp
|
g_hexen/a_clericflame.cpp
|
||||||
|
|
|
@ -20,4 +20,3 @@
|
||||||
|
|
||||||
// Include all the other Heretic stuff here to reduce compile time
|
// Include all the other Heretic stuff here to reduce compile time
|
||||||
#include "a_hereticartifacts.cpp"
|
#include "a_hereticartifacts.cpp"
|
||||||
#include "a_hereticweaps.cpp"
|
|
||||||
|
|
|
@ -1,285 +0,0 @@
|
||||||
/*
|
|
||||||
#include "templates.h"
|
|
||||||
#include "actor.h"
|
|
||||||
#include "info.h"
|
|
||||||
#include "s_sound.h"
|
|
||||||
#include "m_random.h"
|
|
||||||
#include "a_pickups.h"
|
|
||||||
#include "d_player.h"
|
|
||||||
#include "p_pspr.h"
|
|
||||||
#include "p_local.h"
|
|
||||||
#include "gstrings.h"
|
|
||||||
#include "gi.h"
|
|
||||||
#include "r_data/r_translate.h"
|
|
||||||
#include "vm.h"
|
|
||||||
#include "doomstat.h"
|
|
||||||
*/
|
|
||||||
|
|
||||||
static FRandom pr_boltspark ("BoltSpark");
|
|
||||||
static FRandom pr_macerespawn ("MaceRespawn");
|
|
||||||
static FRandom pr_maceatk ("FireMacePL1");
|
|
||||||
static FRandom pr_bfx1 ("BlasterFX1");
|
|
||||||
static FRandom pr_ripd ("RipperD");
|
|
||||||
static FRandom pr_fb1 ("FireBlasterPL1");
|
|
||||||
static FRandom pr_bfx1t ("BlasterFX1Tick");
|
|
||||||
static FRandom pr_rp ("RainPillar");
|
|
||||||
static FRandom pr_fsr1 ("FireSkullRodPL1");
|
|
||||||
static FRandom pr_storm ("SkullRodStorm");
|
|
||||||
static FRandom pr_impact ("RainImpact");
|
|
||||||
static FRandom pr_pfx1 ("PhoenixFX1");
|
|
||||||
static FRandom pr_pfx2 ("PhoenixFX2");
|
|
||||||
static FRandom pr_fp2 ("FirePhoenixPL2");
|
|
||||||
|
|
||||||
#define FLAME_THROWER_TICS (10*TICRATE)
|
|
||||||
|
|
||||||
void P_DSparilTeleport (AActor *actor);
|
|
||||||
|
|
||||||
#define USE_BLSR_AMMO_1 1
|
|
||||||
#define USE_BLSR_AMMO_2 5
|
|
||||||
#define USE_SKRD_AMMO_1 1
|
|
||||||
#define USE_SKRD_AMMO_2 5
|
|
||||||
#define USE_PHRD_AMMO_1 1
|
|
||||||
#define USE_PHRD_AMMO_2 1
|
|
||||||
#define USE_MACE_AMMO_1 1
|
|
||||||
#define USE_MACE_AMMO_2 5
|
|
||||||
|
|
||||||
extern bool P_AutoUseChaosDevice (player_t *player);
|
|
||||||
|
|
||||||
|
|
||||||
// --- Phoenix Rod ----------------------------------------------------------
|
|
||||||
|
|
||||||
class APhoenixRod : public AWeapon
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (APhoenixRod, AWeapon)
|
|
||||||
public:
|
|
||||||
|
|
||||||
void Serialize(FSerializer &arc)
|
|
||||||
{
|
|
||||||
Super::Serialize (arc);
|
|
||||||
arc("flamecount", FlameCount);
|
|
||||||
}
|
|
||||||
int FlameCount; // for flamethrower duration
|
|
||||||
};
|
|
||||||
|
|
||||||
class APhoenixRodPowered : public APhoenixRod
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (APhoenixRodPowered, APhoenixRod)
|
|
||||||
public:
|
|
||||||
void EndPowerup ();
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(APhoenixRod, false, false)
|
|
||||||
IMPLEMENT_CLASS(APhoenixRodPowered, false, false)
|
|
||||||
|
|
||||||
void APhoenixRodPowered::EndPowerup ()
|
|
||||||
{
|
|
||||||
DepleteAmmo (bAltFire);
|
|
||||||
Owner->player->refire = 0;
|
|
||||||
S_StopSound (Owner, CHAN_WEAPON);
|
|
||||||
Owner->player->ReadyWeapon = SisterWeapon;
|
|
||||||
P_SetPsprite(Owner->player, PSP_WEAPON, SisterWeapon->GetReadyState());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phoenix FX 2 -------------------------------------------------------------
|
|
||||||
|
|
||||||
class APhoenixFX2 : public AActor
|
|
||||||
{
|
|
||||||
DECLARE_CLASS (APhoenixFX2, AActor)
|
|
||||||
public:
|
|
||||||
int DoSpecialDamage (AActor *target, int damage, FName damagetype);
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(APhoenixFX2, false, false)
|
|
||||||
|
|
||||||
int APhoenixFX2::DoSpecialDamage (AActor *target, int damage, FName damagetype)
|
|
||||||
{
|
|
||||||
if (target->player && pr_pfx2 () < 128)
|
|
||||||
{ // Freeze player for a bit
|
|
||||||
target->reactiontime += 4;
|
|
||||||
}
|
|
||||||
return damage;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_FirePhoenixPL1
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_FirePhoenixPL1)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
player_t *player;
|
|
||||||
|
|
||||||
if (NULL == (player = self->player))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
AWeapon *weapon = self->player->ReadyWeapon;
|
|
||||||
if (weapon != NULL)
|
|
||||||
{
|
|
||||||
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
P_SpawnPlayerMissile (self, PClass::FindActor("PhoenixFX1"));
|
|
||||||
self->Thrust(self->Angles.Yaw + 180, 4);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_PhoenixPuff
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_PhoenixPuff)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *puff;
|
|
||||||
DAngle ang;
|
|
||||||
|
|
||||||
//[RH] Heretic never sets the target for seeking
|
|
||||||
//P_SeekerMissile (self, 5, 10);
|
|
||||||
puff = Spawn("PhoenixPuff", self->Pos(), ALLOW_REPLACE);
|
|
||||||
ang = self->Angles.Yaw + 90;
|
|
||||||
puff->Vel = DVector3(ang.ToVector(1.3), 0);
|
|
||||||
|
|
||||||
puff = Spawn("PhoenixPuff", self->Pos(), ALLOW_REPLACE);
|
|
||||||
ang = self->Angles.Yaw - 90;
|
|
||||||
puff->Vel = DVector3(ang.ToVector(1.3), 0);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_InitPhoenixPL2
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_InitPhoenixPL2)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
if (self->player != NULL)
|
|
||||||
{
|
|
||||||
APhoenixRod *flamethrower = static_cast<APhoenixRod *> (self->player->ReadyWeapon);
|
|
||||||
if (flamethrower != NULL)
|
|
||||||
{
|
|
||||||
flamethrower->FlameCount = FLAME_THROWER_TICS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_FirePhoenixPL2
|
|
||||||
//
|
|
||||||
// Flame thrower effect.
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_FirePhoenixPL2)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
AActor *mo;
|
|
||||||
|
|
||||||
double slope;
|
|
||||||
FSoundID soundid;
|
|
||||||
player_t *player;
|
|
||||||
APhoenixRod *flamethrower;
|
|
||||||
|
|
||||||
if (nullptr == (player = self->player))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
soundid = "weapons/phoenixpowshoot";
|
|
||||||
|
|
||||||
flamethrower = static_cast<APhoenixRod *> (player->ReadyWeapon);
|
|
||||||
if (flamethrower == nullptr || --flamethrower->FlameCount == 0)
|
|
||||||
{ // Out of flame
|
|
||||||
P_SetPsprite(player, PSP_WEAPON, flamethrower->FindState("Powerdown"));
|
|
||||||
player->refire = 0;
|
|
||||||
S_StopSound (self, CHAN_WEAPON);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
slope = -self->Angles.Pitch.TanClamped();
|
|
||||||
double xo = pr_fp2.Random2() / 128.;
|
|
||||||
double yo = pr_fp2.Random2() / 128.;
|
|
||||||
DVector3 pos = self->Vec3Offset(xo, yo, 26 + slope - self->Floorclip);
|
|
||||||
|
|
||||||
slope += 0.1;
|
|
||||||
mo = Spawn("PhoenixFX2", pos, ALLOW_REPLACE);
|
|
||||||
mo->target = self;
|
|
||||||
mo->Angles.Yaw = self->Angles.Yaw;
|
|
||||||
mo->VelFromAngle();
|
|
||||||
mo->Vel += self->Vel.XY();
|
|
||||||
mo->Vel.Z = mo->Speed * slope;
|
|
||||||
if (!player->refire || !S_IsActorPlayingSomething (self, CHAN_WEAPON, -1))
|
|
||||||
{
|
|
||||||
S_Sound (self, CHAN_WEAPON|CHAN_LOOP, soundid, 1, ATTN_NORM);
|
|
||||||
}
|
|
||||||
P_CheckMissileSpawn (mo, self->radius);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_ShutdownPhoenixPL2
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_ShutdownPhoenixPL2)
|
|
||||||
{
|
|
||||||
PARAM_ACTION_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
player_t *player;
|
|
||||||
|
|
||||||
if (NULL == (player = self->player))
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
S_StopSound (self, CHAN_WEAPON);
|
|
||||||
AWeapon *weapon = player->ReadyWeapon;
|
|
||||||
if (weapon != NULL)
|
|
||||||
{
|
|
||||||
if (!weapon->DepleteAmmo (weapon->bAltFire))
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_FlameEnd
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_FlameEnd)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
self->Vel.Z += 1.5;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// PROC A_FloatPuff
|
|
||||||
//
|
|
||||||
//----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
DEFINE_ACTION_FUNCTION(AActor, A_FloatPuff)
|
|
||||||
{
|
|
||||||
PARAM_SELF_PROLOGUE(AActor);
|
|
||||||
|
|
||||||
self->Vel.Z += 1.8;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -1185,7 +1185,7 @@ void APowerWeaponLevel2::EndEffect ()
|
||||||
if (player->ReadyWeapon != NULL &&
|
if (player->ReadyWeapon != NULL &&
|
||||||
player->ReadyWeapon->WeaponFlags & WIF_POWERED_UP)
|
player->ReadyWeapon->WeaponFlags & WIF_POWERED_UP)
|
||||||
{
|
{
|
||||||
player->ReadyWeapon->EndPowerup ();
|
player->ReadyWeapon->CallEndPowerup ();
|
||||||
}
|
}
|
||||||
if (player->PendingWeapon != NULL && player->PendingWeapon != WP_NOCHANGE &&
|
if (player->PendingWeapon != NULL && player->PendingWeapon != WP_NOCHANGE &&
|
||||||
player->PendingWeapon->WeaponFlags & WIF_POWERED_UP &&
|
player->PendingWeapon->WeaponFlags & WIF_POWERED_UP &&
|
||||||
|
|
|
@ -342,6 +342,7 @@ public:
|
||||||
|
|
||||||
virtual void PostMorphWeapon ();
|
virtual void PostMorphWeapon ();
|
||||||
virtual void EndPowerup ();
|
virtual void EndPowerup ();
|
||||||
|
void CallEndPowerup();
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "d_net.h"
|
#include "d_net.h"
|
||||||
#include "serializer.h"
|
#include "serializer.h"
|
||||||
#include "thingdef.h"
|
#include "thingdef.h"
|
||||||
|
#include "virtual.h"
|
||||||
|
|
||||||
#define BONUSADD 6
|
#define BONUSADD 6
|
||||||
|
|
||||||
|
@ -789,6 +790,26 @@ void AWeapon::EndPowerup ()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFINE_ACTION_FUNCTION(AWeapon, EndPowerup)
|
||||||
|
{
|
||||||
|
PARAM_SELF_PROLOGUE(AWeapon);
|
||||||
|
self->EndPowerup();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AWeapon::CallEndPowerup()
|
||||||
|
{
|
||||||
|
IFVIRTUAL(AWeapon, EndPowerup)
|
||||||
|
{
|
||||||
|
// Without the type cast this picks the 'void *' assignment...
|
||||||
|
VMValue params[1] = { (DObject*)this };
|
||||||
|
VMFrameStack stack;
|
||||||
|
stack.Call(func, params, 1, nullptr, 0, nullptr);
|
||||||
|
}
|
||||||
|
else EndPowerup();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// AWeapon :: GetUpState
|
// AWeapon :: GetUpState
|
||||||
|
|
|
@ -85,7 +85,6 @@ zscript/heretic/hereticartifacts.txt
|
||||||
zscript/heretic/heretickeys.txt
|
zscript/heretic/heretickeys.txt
|
||||||
zscript/heretic/hereticdecorations.txt
|
zscript/heretic/hereticdecorations.txt
|
||||||
zscript/heretic/hereticmisc.txt
|
zscript/heretic/hereticmisc.txt
|
||||||
zscript/heretic/hereticweaps.txt
|
|
||||||
zscript/heretic/mummy.txt
|
zscript/heretic/mummy.txt
|
||||||
zscript/heretic/clink.txt
|
zscript/heretic/clink.txt
|
||||||
zscript/heretic/beast.txt
|
zscript/heretic/beast.txt
|
||||||
|
@ -103,6 +102,7 @@ zscript/heretic/weapongauntlets.txt
|
||||||
zscript/heretic/weaponmace.txt
|
zscript/heretic/weaponmace.txt
|
||||||
zscript/heretic/weaponblaster.txt
|
zscript/heretic/weaponblaster.txt
|
||||||
zscript/heretic/weaponskullrod.txt
|
zscript/heretic/weaponskullrod.txt
|
||||||
|
zscript/heretic/weaponphoenix.txt
|
||||||
|
|
||||||
zscript/hexen/baseweapons.txt
|
zscript/hexen/baseweapons.txt
|
||||||
zscript/hexen/korax.txt
|
zscript/hexen/korax.txt
|
||||||
|
|
|
@ -1,184 +0,0 @@
|
||||||
|
|
||||||
class HereticWeapon : Weapon
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
Weapon.Kickback 150;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Phoenix Rod --------------------------------------------------------------
|
|
||||||
|
|
||||||
class PhoenixRod : Weapon native
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
+WEAPON.NOAUTOFIRE
|
|
||||||
Weapon.SelectionOrder 2600;
|
|
||||||
Weapon.Kickback 150;
|
|
||||||
Weapon.YAdjust 15;
|
|
||||||
Weapon.AmmoUse 1;
|
|
||||||
Weapon.AmmoGive 2;
|
|
||||||
Weapon.AmmoType "PhoenixRodAmmo";
|
|
||||||
Weapon.Sisterweapon "PhoenixRodPowered";
|
|
||||||
Inventory.PickupMessage "$TXT_WPNPHOENIXROD";
|
|
||||||
Tag "$TAG_PHOENIXROD";
|
|
||||||
}
|
|
||||||
|
|
||||||
action native void A_FirePhoenixPL1();
|
|
||||||
|
|
||||||
States
|
|
||||||
{
|
|
||||||
Spawn:
|
|
||||||
WPHX A -1;
|
|
||||||
Stop;
|
|
||||||
Ready:
|
|
||||||
PHNX A 1 A_WeaponReady;
|
|
||||||
Loop;
|
|
||||||
Deselect:
|
|
||||||
PHNX A 1 A_Lower;
|
|
||||||
Loop;
|
|
||||||
Select:
|
|
||||||
PHNX A 1 A_Raise;
|
|
||||||
Loop;
|
|
||||||
Fire:
|
|
||||||
PHNX B 5;
|
|
||||||
PHNX C 7 A_FirePhoenixPL1;
|
|
||||||
PHNX DB 4;
|
|
||||||
PHNX B 0 A_ReFire;
|
|
||||||
Goto Ready;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class PhoenixRodPowered : PhoenixRod native
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
+WEAPON.POWERED_UP
|
|
||||||
+WEAPON.MELEEWEAPON
|
|
||||||
Weapon.SisterWeapon "PhoenixRod";
|
|
||||||
Weapon.AmmoGive 0;
|
|
||||||
Tag "$TAG_PHOENIXRODP";
|
|
||||||
}
|
|
||||||
|
|
||||||
action native void A_InitPhoenixPL2();
|
|
||||||
action native void A_FirePhoenixPL2();
|
|
||||||
action native void A_ShutdownPhoenixPL2();
|
|
||||||
|
|
||||||
States
|
|
||||||
{
|
|
||||||
Fire:
|
|
||||||
PHNX B 3 A_InitPhoenixPL2;
|
|
||||||
Hold:
|
|
||||||
PHNX C 1 A_FirePhoenixPL2;
|
|
||||||
PHNX B 4 A_ReFire;
|
|
||||||
Powerdown:
|
|
||||||
PHNX B 4 A_ShutdownPhoenixPL2;
|
|
||||||
Goto Ready;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phoenix FX 1 -------------------------------------------------------------
|
|
||||||
|
|
||||||
class PhoenixFX1 : Actor
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
Radius 11;
|
|
||||||
Height 8;
|
|
||||||
Speed 20;
|
|
||||||
Damage 20;
|
|
||||||
DamageType "Fire";
|
|
||||||
Projectile;
|
|
||||||
+THRUGHOST
|
|
||||||
+SPECIALFIREDAMAGE
|
|
||||||
SeeSound "weapons/phoenixshoot";
|
|
||||||
DeathSound "weapons/phoenixhit";
|
|
||||||
Obituary "$OB_MPPHOENIXROD";
|
|
||||||
}
|
|
||||||
|
|
||||||
native void A_PhoenixPuff();
|
|
||||||
|
|
||||||
States
|
|
||||||
{
|
|
||||||
Spawn:
|
|
||||||
FX04 A 4 BRIGHT A_PhoenixPuff;
|
|
||||||
Loop;
|
|
||||||
Death:
|
|
||||||
FX08 A 6 BRIGHT A_Explode;
|
|
||||||
FX08 BC 5 BRIGHT;
|
|
||||||
FX08 DEFGH 4 BRIGHT;
|
|
||||||
Stop;
|
|
||||||
}
|
|
||||||
|
|
||||||
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
|
|
||||||
{
|
|
||||||
Sorcerer2 s2 = Sorcerer2(target);
|
|
||||||
if (s2 != null && random[HornRodFX2]() < 96)
|
|
||||||
{ // D'Sparil teleports away
|
|
||||||
s2.DSparilTeleport ();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return damage;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phoenix puff -------------------------------------------------------------
|
|
||||||
|
|
||||||
class PhoenixPuff : Actor
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
+NOBLOCKMAP
|
|
||||||
+NOGRAVITY
|
|
||||||
+NOTELEPORT
|
|
||||||
+CANNOTPUSH
|
|
||||||
RenderStyle "Translucent";
|
|
||||||
Alpha 0.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
States
|
|
||||||
{
|
|
||||||
Spawn:
|
|
||||||
FX04 BCDEF 4;
|
|
||||||
Stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Phoenix FX 2 -------------------------------------------------------------
|
|
||||||
|
|
||||||
class PhoenixFX2 : Actor native
|
|
||||||
{
|
|
||||||
Default
|
|
||||||
{
|
|
||||||
Radius 6;
|
|
||||||
Height 8;
|
|
||||||
Speed 10;
|
|
||||||
Damage 2;
|
|
||||||
DamageType "Fire";
|
|
||||||
Projectile;
|
|
||||||
RenderStyle "Add";
|
|
||||||
Obituary "$OB_MPPPHOENIXROD";
|
|
||||||
}
|
|
||||||
|
|
||||||
native void A_FlameEnd();
|
|
||||||
native void A_FloatPuff();
|
|
||||||
|
|
||||||
States
|
|
||||||
{
|
|
||||||
Spawn:
|
|
||||||
FX09 ABABA 2 BRIGHT;
|
|
||||||
FX09 B 2 BRIGHT A_FlameEnd;
|
|
||||||
FX09 CDEF 2 BRIGHT;
|
|
||||||
Stop;
|
|
||||||
Death:
|
|
||||||
FX09 G 3 BRIGHT;
|
|
||||||
FX09 H 3 BRIGHT A_FloatPuff;
|
|
||||||
FX09 I 4 BRIGHT;
|
|
||||||
FX09 JK 5 BRIGHT;
|
|
||||||
Stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
347
wadsrc/static/zscript/heretic/weaponphoenix.txt
Normal file
347
wadsrc/static/zscript/heretic/weaponphoenix.txt
Normal file
|
@ -0,0 +1,347 @@
|
||||||
|
|
||||||
|
class HereticWeapon : Weapon
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Weapon.Kickback 150;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Phoenix Rod --------------------------------------------------------------
|
||||||
|
|
||||||
|
class PhoenixRod : Weapon
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
+WEAPON.NOAUTOFIRE
|
||||||
|
Weapon.SelectionOrder 2600;
|
||||||
|
Weapon.Kickback 150;
|
||||||
|
Weapon.YAdjust 15;
|
||||||
|
Weapon.AmmoUse 1;
|
||||||
|
Weapon.AmmoGive 2;
|
||||||
|
Weapon.AmmoType "PhoenixRodAmmo";
|
||||||
|
Weapon.Sisterweapon "PhoenixRodPowered";
|
||||||
|
Inventory.PickupMessage "$TXT_WPNPHOENIXROD";
|
||||||
|
Tag "$TAG_PHOENIXROD";
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
WPHX A -1;
|
||||||
|
Stop;
|
||||||
|
Ready:
|
||||||
|
PHNX A 1 A_WeaponReady;
|
||||||
|
Loop;
|
||||||
|
Deselect:
|
||||||
|
PHNX A 1 A_Lower;
|
||||||
|
Loop;
|
||||||
|
Select:
|
||||||
|
PHNX A 1 A_Raise;
|
||||||
|
Loop;
|
||||||
|
Fire:
|
||||||
|
PHNX B 5;
|
||||||
|
PHNX C 7 A_FirePhoenixPL1;
|
||||||
|
PHNX DB 4;
|
||||||
|
PHNX B 0 A_ReFire;
|
||||||
|
Goto Ready;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_FirePhoenixPL1
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
action void A_FirePhoenixPL1()
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Weapon weapon = player.ReadyWeapon;
|
||||||
|
if (weapon != null)
|
||||||
|
{
|
||||||
|
if (!weapon.DepleteAmmo (weapon.bAltFire))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
SpawnPlayerMissile ("PhoenixFX1");
|
||||||
|
Thrust(4, angle + 180);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class PhoenixRodPowered : PhoenixRod
|
||||||
|
{
|
||||||
|
const FLAME_THROWER_TICS = (10*TICRATE);
|
||||||
|
|
||||||
|
private int FlameCount; // for flamethrower duration
|
||||||
|
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
+WEAPON.POWERED_UP
|
||||||
|
+WEAPON.MELEEWEAPON
|
||||||
|
Weapon.SisterWeapon "PhoenixRod";
|
||||||
|
Weapon.AmmoGive 0;
|
||||||
|
Tag "$TAG_PHOENIXRODP";
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Fire:
|
||||||
|
PHNX B 3 A_InitPhoenixPL2;
|
||||||
|
Hold:
|
||||||
|
PHNX C 1 A_FirePhoenixPL2;
|
||||||
|
PHNX B 4 A_ReFire;
|
||||||
|
Powerdown:
|
||||||
|
PHNX B 4 A_ShutdownPhoenixPL2;
|
||||||
|
Goto Ready;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
override void EndPowerup ()
|
||||||
|
{
|
||||||
|
DepleteAmmo (bAltFire);
|
||||||
|
Owner.player.refire = 0;
|
||||||
|
Owner.A_StopSound (CHAN_WEAPON);
|
||||||
|
Owner.player.ReadyWeapon = SisterWeapon;
|
||||||
|
Owner.player.SetPsprite(PSP_WEAPON, SisterWeapon.GetReadyState());
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_InitPhoenixPL2
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
action void A_InitPhoenixPL2()
|
||||||
|
{
|
||||||
|
if (player != null)
|
||||||
|
{
|
||||||
|
PhoenixRodPowered flamethrower = PhoenixRodPowered(player.ReadyWeapon);
|
||||||
|
if (flamethrower != null)
|
||||||
|
{
|
||||||
|
flamethrower.FlameCount = FLAME_THROWER_TICS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_FirePhoenixPL2
|
||||||
|
//
|
||||||
|
// Flame thrower effect.
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
action void A_FirePhoenixPL2()
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
PhoenixRodPowered flamethrower = PhoenixRodPowered(player.ReadyWeapon);
|
||||||
|
|
||||||
|
if (flamethrower == null || --flamethrower.FlameCount == 0)
|
||||||
|
{ // Out of flame
|
||||||
|
player.SetPsprite(PSP_WEAPON, flamethrower.FindState("Powerdown"));
|
||||||
|
player.refire = 0;
|
||||||
|
A_StopSound (CHAN_WEAPON);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double slope = -clamp(tan(pitch), -5, 5);
|
||||||
|
double xo = Random2[FirePhoenixPL2]() / 128.;
|
||||||
|
double yo = Random2[FirePhoenixPL2]() / 128.;
|
||||||
|
Vector3 spawnpos = Vec3Offset(xo, yo, 26 + slope - Floorclip);
|
||||||
|
|
||||||
|
slope += 0.1;
|
||||||
|
Actor mo = Spawn("PhoenixFX2", spawnpos, ALLOW_REPLACE);
|
||||||
|
mo.target = self;
|
||||||
|
mo.Angle = Angle;
|
||||||
|
mo.VelFromAngle();
|
||||||
|
mo.Vel.XY += Vel.XY;
|
||||||
|
mo.Vel.Z = mo.Speed * slope;
|
||||||
|
if (!player.refire)
|
||||||
|
{
|
||||||
|
A_PlaySound("weapons/phoenixpowshoot", CHAN_WEAPON, 1, true);
|
||||||
|
}
|
||||||
|
mo.CheckMissileSpawn (radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_ShutdownPhoenixPL2
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
action void A_ShutdownPhoenixPL2()
|
||||||
|
{
|
||||||
|
if (player == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
A_StopSound (CHAN_WEAPON);
|
||||||
|
Weapon weapon = player.ReadyWeapon;
|
||||||
|
if (weapon != null)
|
||||||
|
{
|
||||||
|
weapon.DepleteAmmo (weapon.bAltFire);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Phoenix FX 1 -------------------------------------------------------------
|
||||||
|
|
||||||
|
class PhoenixFX1 : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Radius 11;
|
||||||
|
Height 8;
|
||||||
|
Speed 20;
|
||||||
|
Damage 20;
|
||||||
|
DamageType "Fire";
|
||||||
|
Projectile;
|
||||||
|
+THRUGHOST
|
||||||
|
+SPECIALFIREDAMAGE
|
||||||
|
SeeSound "weapons/phoenixshoot";
|
||||||
|
DeathSound "weapons/phoenixhit";
|
||||||
|
Obituary "$OB_MPPHOENIXROD";
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX04 A 4 BRIGHT A_PhoenixPuff;
|
||||||
|
Loop;
|
||||||
|
Death:
|
||||||
|
FX08 A 6 BRIGHT A_Explode;
|
||||||
|
FX08 BC 5 BRIGHT;
|
||||||
|
FX08 DEFGH 4 BRIGHT;
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
override int DoSpecialDamage (Actor target, int damage, Name damagetype)
|
||||||
|
{
|
||||||
|
Sorcerer2 s2 = Sorcerer2(target);
|
||||||
|
if (s2 != null && random[HornRodFX2]() < 96)
|
||||||
|
{ // D'Sparil teleports away
|
||||||
|
s2.DSparilTeleport ();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_PhoenixPuff
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void A_PhoenixPuff()
|
||||||
|
{
|
||||||
|
//[RH] Heretic never sets the target for seeking
|
||||||
|
//P_SeekerMissile (self, 5, 10);
|
||||||
|
Actor puff = Spawn("PhoenixPuff", Pos, ALLOW_REPLACE);
|
||||||
|
puff.Vel.XY = AngleToVector(Angle + 90, 1.3);
|
||||||
|
|
||||||
|
puff = Spawn("PhoenixPuff", Pos, ALLOW_REPLACE);
|
||||||
|
puff.Vel.XY = AngleToVector(Angle - 90, 1.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Phoenix puff -------------------------------------------------------------
|
||||||
|
|
||||||
|
class PhoenixPuff : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
+NOBLOCKMAP
|
||||||
|
+NOGRAVITY
|
||||||
|
+NOTELEPORT
|
||||||
|
+CANNOTPUSH
|
||||||
|
RenderStyle "Translucent";
|
||||||
|
Alpha 0.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX04 BCDEF 4;
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Phoenix FX 2 -------------------------------------------------------------
|
||||||
|
|
||||||
|
class PhoenixFX2 : Actor
|
||||||
|
{
|
||||||
|
Default
|
||||||
|
{
|
||||||
|
Radius 6;
|
||||||
|
Height 8;
|
||||||
|
Speed 10;
|
||||||
|
Damage 2;
|
||||||
|
DamageType "Fire";
|
||||||
|
Projectile;
|
||||||
|
RenderStyle "Add";
|
||||||
|
Obituary "$OB_MPPPHOENIXROD";
|
||||||
|
}
|
||||||
|
|
||||||
|
States
|
||||||
|
{
|
||||||
|
Spawn:
|
||||||
|
FX09 ABABA 2 BRIGHT;
|
||||||
|
FX09 B 2 BRIGHT A_FlameEnd;
|
||||||
|
FX09 CDEF 2 BRIGHT;
|
||||||
|
Stop;
|
||||||
|
Death:
|
||||||
|
FX09 G 3 BRIGHT;
|
||||||
|
FX09 H 3 BRIGHT A_FloatPuff;
|
||||||
|
FX09 I 4 BRIGHT;
|
||||||
|
FX09 JK 5 BRIGHT;
|
||||||
|
Stop;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int DoSpecialDamage (Actor target, int damage, Name damagetype)
|
||||||
|
{
|
||||||
|
if (target.player && Random[PhoenixFX2]() < 128)
|
||||||
|
{ // Freeze player for a bit
|
||||||
|
target.reactiontime += 4;
|
||||||
|
}
|
||||||
|
return damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_FlameEnd
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void A_FlameEnd()
|
||||||
|
{
|
||||||
|
Vel.Z += 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
// PROC A_FloatPuff
|
||||||
|
//
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void A_FloatPuff()
|
||||||
|
{
|
||||||
|
Vel.Z += 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -569,6 +569,7 @@ class Weapon : StateProvider native
|
||||||
}
|
}
|
||||||
|
|
||||||
native bool DepleteAmmo(bool altFire, bool checkEnough = true, int ammouse = -1);
|
native bool DepleteAmmo(bool altFire, bool checkEnough = true, int ammouse = -1);
|
||||||
|
native virtual void EndPowerup();
|
||||||
|
|
||||||
virtual State GetReadyState ()
|
virtual State GetReadyState ()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue