- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.

- Added a check to Zipdir that excludes files with a .orig extension. These
  can be left behind by patch.exe and create problems.
- fixed: Unmorphing from chicken caused a crash when reading non-existent
  meta-data strings.


SVN r1112 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-05 16:04:37 +00:00
parent 4a9e70f1d2
commit 43715c5249
10 changed files with 399 additions and 429 deletions

View File

@ -1,4 +1,9 @@
August 5, 2008 (Changes by Graf Zahl)
- Added DECORATE conversions for Hexen's Cleric weapons by Karate Chris.
- Added a check to Zipdir that excludes files with a .orig extension. These
can be left behind by patch.exe and create problems.
- fixed: Unmorphing from chicken caused a crash when reading non-existent
meta-data strings.
- Converted the ScriptedMarines to DECORATE.
- Fixed: DLightTransfer and DWallLightTransfer were declared as actors.

View File

@ -207,7 +207,18 @@ WEAPON(CFlameAttack)
WEAPON(CFlameRotate)
ACTOR(CFlamePuff)
WEAPON(CFlameMissile)
ACTOR(DropWraithvergePieces)
WEAPON(CHolyAttack)
WEAPON(CHolyAttack2)
WEAPON(CHolyPalette)
ACTOR(CHolySeek)
ACTOR(CHolyCheckScream)
ACTOR(CHolyTail)
WEAPON(CMaceAttack)
WEAPON(CStaffInitBlink)
WEAPON(CStaffCheckBlink)
WEAPON(CStaffCheck)
WEAPON(CStaffAttack)
ACTOR(FiredRocks)
ACTOR(FiredChase)
ACTOR(FiredAttack)

View File

@ -17,7 +17,6 @@ static FRandom pr_checkscream ("CCheckScream");
static FRandom pr_spiritslam ("CHolySlam");
static FRandom pr_wraithvergedrop ("WraithvergeDrop");
void A_CHolySpawnPuff (AActor *);
void A_CHolyAttack2 (AActor *);
void A_CHolyTail (AActor *);
void A_CHolySeek (AActor *);
@ -33,16 +32,14 @@ void SpawnSpiritTail (AActor *spirit);
class AClericWeaponPiece : public AFourthWeaponPiece
{
DECLARE_STATELESS_ACTOR (AClericWeaponPiece, AFourthWeaponPiece)
DECLARE_CLASS (AClericWeaponPiece, AFourthWeaponPiece)
public:
void BeginPlay ();
protected:
bool MatchPlayerClass (AActor *toucher);
};
IMPLEMENT_STATELESS_ACTOR (AClericWeaponPiece, Hexen, -1, 0)
PROP_Inventory_PickupMessage("$TXT_WRAITHVERGE_PIECE")
END_DEFAULTS
IMPLEMENT_CLASS (AClericWeaponPiece)
bool AClericWeaponPiece::MatchPlayerClass (AActor *toucher)
{
@ -54,21 +51,12 @@ bool AClericWeaponPiece::MatchPlayerClass (AActor *toucher)
class ACWeaponPiece1 : public AClericWeaponPiece
{
DECLARE_ACTOR (ACWeaponPiece1, AClericWeaponPiece)
DECLARE_CLASS (ACWeaponPiece1, AClericWeaponPiece)
public:
void BeginPlay ();
};
FState ACWeaponPiece1::States[] =
{
S_BRIGHT (WCH1, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (ACWeaponPiece1, Hexen, 18, 33)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (ACWeaponPiece1)
void ACWeaponPiece1::BeginPlay ()
{
@ -85,16 +73,7 @@ public:
void BeginPlay ();
};
FState ACWeaponPiece2::States[] =
{
S_BRIGHT (WCH2, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (ACWeaponPiece2, Hexen, 19, 34)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (ACWeaponPiece2)
void ACWeaponPiece2::BeginPlay ()
{
@ -111,16 +90,7 @@ public:
void BeginPlay ();
};
FState ACWeaponPiece3::States[] =
{
S_BRIGHT (WCH3, 'A', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (ACWeaponPiece3, Hexen, 20, 35)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOATBOB)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (ACWeaponPiece3)
void ACWeaponPiece3::BeginPlay ()
{
@ -128,27 +98,6 @@ void ACWeaponPiece3::BeginPlay ()
PieceValue = WPIECE3<<3;
}
// An actor that spawns the three pieces of the cleric's fourth weapon ------
// This gets spawned if weapon drop is on so that other players can pick up
// this player's weapon.
class AWraithvergeDrop : public AActor
{
DECLARE_ACTOR (AWraithvergeDrop, AActor)
};
FState AWraithvergeDrop::States[] =
{
S_NORMAL (TNT1, 'A', 1, NULL, &States[1]),
S_NORMAL (TNT1, 'A', 1, A_DropWraithvergePieces, NULL)
};
IMPLEMENT_ACTOR (AWraithvergeDrop, Hexen, -1, 0)
PROP_SpawnState (0)
END_DEFAULTS
// Cleric's Wraithverge (Holy Symbol?) --------------------------------------
class ACWeapWraithverge : public AClericWeapon
@ -167,171 +116,11 @@ public:
BYTE CHolyCount;
};
FState ACWeapWraithverge::States[] =
{
// Dummy state, because the fourth weapon does not appear in a level directly.
S_NORMAL (TNT1, 'A', -1, NULL , NULL),
#define S_CHOLYREADY 1
S_NORMAL (CHLY, 'A', 1, A_WeaponReady , &States[S_CHOLYREADY]),
#define S_CHOLYDOWN (S_CHOLYREADY+1)
S_NORMAL (CHLY, 'A', 1, A_Lower , &States[S_CHOLYDOWN]),
#define S_CHOLYUP (S_CHOLYDOWN+1)
S_NORMAL (CHLY, 'A', 1, A_Raise , &States[S_CHOLYUP]),
#define S_CHOLYATK (S_CHOLYUP+1)
S_BRIGHT2 (CHLY, 'A', 1, NULL , &States[S_CHOLYATK+1], 0, 40),
S_BRIGHT2 (CHLY, 'B', 1, NULL , &States[S_CHOLYATK+2], 0, 40),
S_BRIGHT2 (CHLY, 'C', 2, NULL , &States[S_CHOLYATK+3], 0, 43),
S_BRIGHT2 (CHLY, 'D', 2, NULL , &States[S_CHOLYATK+4], 0, 43),
S_BRIGHT2 (CHLY, 'E', 2, NULL , &States[S_CHOLYATK+5], 0, 45),
S_BRIGHT2 (CHLY, 'F', 6, A_CHolyAttack , &States[S_CHOLYATK+6], 0, 48),
S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYATK+7], 0, 40),
S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYATK+8], 0, 40),
S_BRIGHT2 (CHLY, 'G', 2, A_CHolyPalette , &States[S_CHOLYREADY], 0, 36)
};
IMPLEMENT_ACTOR (ACWeapWraithverge, Hexen, -1, 0)
PROP_Flags (MF_SPECIAL)
PROP_SpawnState (0)
PROP_Weapon_SelectionOrder (3000)
PROP_Weapon_Flags (WIF_PRIMARY_USES_BOTH)
PROP_Weapon_AmmoUse1 (18)
PROP_Weapon_AmmoUse2 (18)
PROP_Weapon_AmmoGive1 (0)
PROP_Weapon_AmmoGive2 (0)
PROP_Weapon_UpState (S_CHOLYUP)
PROP_Weapon_DownState (S_CHOLYDOWN)
PROP_Weapon_ReadyState (S_CHOLYREADY)
PROP_Weapon_AtkState (S_CHOLYATK)
PROP_Weapon_Kickback (150)
PROP_Weapon_MoveCombatDist (22000000)
PROP_Weapon_AmmoType1 ("Mana1")
PROP_Weapon_AmmoType2 ("Mana2")
PROP_Weapon_ProjectileType ("HolyMissile")
PROP_Inventory_PickupMessage("$TXT_WEAPON_C4")
END_DEFAULTS
// Holy Missile -------------------------------------------------------------
class AHolyMissile : public AActor
{
DECLARE_ACTOR (AHolyMissile, AActor)
};
FState AHolyMissile::States[] =
{
S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[1]),
S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[2]),
S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[3]),
S_BRIGHT (SPIR, 'P', 3, A_CHolySpawnPuff , &States[4]),
S_BRIGHT (SPIR, 'P', 1, A_CHolyAttack2 , NULL),
};
IMPLEMENT_ACTOR (AHolyMissile, Hexen, -1, 0)
PROP_SpeedFixed (30)
PROP_RadiusFixed (15)
PROP_HeightFixed (8)
PROP_Damage (4)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_Flags4 (MF4_EXTREMEDEATH)
PROP_SpawnState (0)
PROP_DeathState (4)
END_DEFAULTS
// Holy Missile Puff --------------------------------------------------------
class AHolyMissilePuff : public AActor
{
DECLARE_ACTOR (AHolyMissilePuff, AActor)
};
FState AHolyMissilePuff::States[] =
{
S_NORMAL (SPIR, 'Q', 3, NULL , &States[1]),
S_NORMAL (SPIR, 'R', 3, NULL , &States[2]),
S_NORMAL (SPIR, 'S', 3, NULL , &States[3]),
S_NORMAL (SPIR, 'T', 3, NULL , &States[4]),
S_NORMAL (SPIR, 'U', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AHolyMissilePuff, Hexen, -1, 0)
PROP_RadiusFixed (4)
PROP_HeightFixed (8)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_ALTSHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Holy Puff ----------------------------------------------------------------
class AHolyPuff : public AActor
{
DECLARE_ACTOR (AHolyPuff, AActor)
};
FState AHolyPuff::States[] =
{
S_NORMAL (SPIR, 'K', 3, NULL , &States[1]),
S_NORMAL (SPIR, 'L', 3, NULL , &States[2]),
S_NORMAL (SPIR, 'M', 3, NULL , &States[3]),
S_NORMAL (SPIR, 'N', 3, NULL , &States[4]),
S_NORMAL (SPIR, 'O', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (AHolyPuff, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
END_DEFAULTS
IMPLEMENT_CLASS (ACWeapWraithverge)
// Holy Spirit --------------------------------------------------------------
FState AHolySpirit::States[] =
{
#define S_HOLY_FX1 0
S_NORMAL (SPIR, 'A', 2, A_CHolySeek , &States[S_HOLY_FX1+1]),
S_NORMAL (SPIR, 'A', 2, A_CHolySeek , &States[S_HOLY_FX1+2]),
S_NORMAL (SPIR, 'B', 2, A_CHolySeek , &States[S_HOLY_FX1+3]),
S_NORMAL (SPIR, 'B', 2, A_CHolyCheckScream , &States[S_HOLY_FX1]),
#define S_HOLY_FX_X1 (S_HOLY_FX1+4)
S_NORMAL (SPIR, 'D', 4, NULL , &States[S_HOLY_FX_X1+1]),
S_NORMAL (SPIR, 'E', 4, A_Scream , &States[S_HOLY_FX_X1+2]),
S_NORMAL (SPIR, 'F', 4, NULL , &States[S_HOLY_FX_X1+3]),
S_NORMAL (SPIR, 'G', 4, NULL , &States[S_HOLY_FX_X1+4]),
S_NORMAL (SPIR, 'H', 4, NULL , &States[S_HOLY_FX_X1+5]),
S_NORMAL (SPIR, 'I', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (AHolySpirit, Hexen, -1, 0)
PROP_SpawnHealth (105)
PROP_SpeedFixed (12)
PROP_RadiusFixed (10)
PROP_HeightFixed (6)
PROP_Damage (3)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP|MF2_IMPACT|MF2_PCROSS|MF2_SEEKERMISSILE)
PROP_Flags3 (MF3_FOILINVUL|MF3_SKYEXPLODE|MF3_NOEXPLODEFLOOR|MF3_CANBLAST)
PROP_Flags4 (MF4_EXTREMEDEATH)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_ALTSHADOW)
PROP_SpawnState (S_HOLY_FX1)
PROP_DeathState (S_HOLY_FX_X1)
PROP_DeathSound ("SpiritDie")
END_DEFAULTS
IMPLEMENT_CLASS (AHolySpirit)
bool AHolySpirit::Slam (AActor *thing)
{
@ -364,7 +153,7 @@ bool AHolySpirit::Slam (AActor *thing)
P_DamageMobj (thing, this, target, dam, NAME_Melee);
if (pr_spiritslam() < 128)
{
Spawn<AHolyPuff> (x, y, z, ALLOW_REPLACE);
Spawn ("HolyPuff", x, y, z, ALLOW_REPLACE);
S_Sound (this, CHAN_WEAPON, "SpiritAttack", 1, ATTN_NORM);
if (thing->flags3&MF3_ISMONSTER && pr_spiritslam() < 128)
{
@ -421,43 +210,6 @@ bool AHolySpirit::IsOkayToAttack (AActor *link)
return false;
}
// Holy Tail ----------------------------------------------------------------
class AHolyTail : public AActor
{
DECLARE_ACTOR (AHolyTail, AActor)
};
FState AHolyTail::States[] =
{
S_NORMAL (SPIR, 'C', 1, A_CHolyTail , &States[0]),
S_NORMAL (SPIR, 'D', -1, NULL , NULL),
};
IMPLEMENT_ACTOR (AHolyTail, Hexen, -1, 0)
PROP_RadiusFixed (1)
PROP_HeightFixed (1)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_NOCLIP)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_ALTSHADOW)
PROP_SpawnState (0)
END_DEFAULTS
// Holy Tail Trail ---------------------------------------------------------
class AHolyTailTrail : public AHolyTail
{
DECLARE_STATELESS_ACTOR (AHolyTailTrail, AHolyTail)
};
IMPLEMENT_STATELESS_ACTOR (AHolyTailTrail, Hexen, -1, 0)
PROP_SpawnState (1)
END_DEFAULTS
//============================================================================
//
// A_CHolyAttack3
@ -467,7 +219,7 @@ END_DEFAULTS
void A_CHolyAttack3 (AActor *actor)
{
AActor * missile = P_SpawnMissileZ (actor, actor->z + 40*FRACUNIT, actor->target, RUNTIME_CLASS(AHolyMissile));
AActor * missile = P_SpawnMissileZ (actor, actor->z + 40*FRACUNIT, actor->target, PClass::FindClass ("HolyMissile"));
if (missile != NULL) missile->tracer = NULL; // No initial target
S_Sound (actor, CHAN_WEAPON, "HolySymbolFire", 1, ATTN_NORM);
}
@ -539,11 +291,11 @@ void SpawnSpiritTail (AActor *spirit)
AActor *tail, *next;
int i;
tail = Spawn<AHolyTail> (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
tail = Spawn ("HolyTail", spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
tail->target = spirit; // parent
for (i = 1; i < 3; i++)
{
next = Spawn<AHolyTailTrail> (spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
next = Spawn ("HolyTailTrail", spirit->x, spirit->y, spirit->z, ALLOW_REPLACE);
tail->tracer = next;
tail = next;
}
@ -571,7 +323,7 @@ void A_CHolyAttack (AActor *actor)
if (!weapon->DepleteAmmo (weapon->bAltFire))
return;
}
AActor * missile = P_SpawnPlayerMissile (actor, 0,0,0, RUNTIME_CLASS(AHolyMissile), actor->angle, &linetarget);
AActor * missile = P_SpawnPlayerMissile (actor, 0,0,0, PClass::FindClass ("HolyMissile"), actor->angle, &linetarget);
if (missile != NULL) missile->tracer = linetarget;
weapon->CHolyCount = 3;
@ -867,17 +619,6 @@ void A_CHolyCheckScream (AActor *actor)
}
}
//============================================================================
//
// A_CHolySpawnPuff
//
//============================================================================
void A_CHolySpawnPuff (AActor *actor)
{
Spawn<AHolyMissilePuff> (actor->x, actor->y, actor->z, ALLOW_REPLACE);
}
void AClericWeaponPiece::BeginPlay ()
{
Super::BeginPlay ();

View File

@ -20,120 +20,16 @@ void A_CStaffCheck (AActor *actor);
void A_CStaffAttack (AActor *actor);
void A_CStaffMissileSlither (AActor *);
// The Cleric's Serpent Staff -----------------------------------------------
class ACWeapStaff : public AClericWeapon
{
DECLARE_ACTOR (ACWeapStaff, AClericWeapon)
};
FState ACWeapStaff::States[] =
{
#define S_CSTAFF 0
S_NORMAL (WCSS, 'A', -1, NULL , NULL),
#define S_CSTAFFREADY (S_CSTAFF+1)
S_NORMAL (CSSF, 'C', 4, NULL , &States[S_CSTAFFREADY+1]),
S_NORMAL (CSSF, 'B', 3, A_CStaffInitBlink , &States[S_CSTAFFREADY+2]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+3]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+4]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+5]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+6]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+7]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+8]),
S_NORMAL (CSSF, 'A', 1, A_WeaponReady , &States[S_CSTAFFREADY+9]),
S_NORMAL (CSSF, 'A', 1, A_CStaffCheckBlink , &States[S_CSTAFFREADY+2]),
#define S_CSTAFFBLINK (S_CSTAFFREADY+10)
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+1]),
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+2]),
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+3]),
S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+4]),
S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+5]),
S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+6]),
S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+7]),
S_NORMAL (CSSF, 'C', 1, A_WeaponReady , &States[S_CSTAFFBLINK+8]),
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+9]),
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFBLINK+10]),
S_NORMAL (CSSF, 'B', 1, A_WeaponReady , &States[S_CSTAFFREADY+2]),
#define S_CSTAFFDOWN (S_CSTAFFBLINK+11)
S_NORMAL (CSSF, 'B', 3, NULL , &States[S_CSTAFFDOWN+1]),
S_NORMAL (CSSF, 'C', 4, NULL , &States[S_CSTAFFDOWN+2]),
S_NORMAL (CSSF, 'C', 1, A_Lower , &States[S_CSTAFFDOWN+2]),
#define S_CSTAFFUP (S_CSTAFFDOWN+3)
S_NORMAL (CSSF, 'C', 1, A_Raise , &States[S_CSTAFFUP]),
#define S_CSTAFFATK (S_CSTAFFUP+1)
S_NORMAL2 (CSSF, 'A', 1, A_CStaffCheck , &States[S_CSTAFFATK+1], 0, 45),
S_NORMAL2 (CSSF, 'J', 1, A_CStaffAttack , &States[S_CSTAFFATK+2], 0, 50),
S_NORMAL2 (CSSF, 'J', 2, NULL , &States[S_CSTAFFATK+3], 0, 50),
S_NORMAL2 (CSSF, 'J', 2, NULL , &States[S_CSTAFFATK+4], 0, 45),
S_NORMAL2 (CSSF, 'A', 2, NULL , &States[S_CSTAFFATK+5], 0, 40),
S_NORMAL2 (CSSF, 'A', 2, NULL , &States[S_CSTAFFREADY+2], 0, 36),
#define S_CSTAFFATK2 (S_CSTAFFATK+6)
S_NORMAL2 (CSSF, 'K', 10, NULL , &States[S_CSTAFFREADY+2], 0, 36),
};
IMPLEMENT_ACTOR (ACWeapStaff, Hexen, 10, 32)
PROP_Flags (MF_SPECIAL)
PROP_SpawnState (S_CSTAFF)
PROP_Weapon_SelectionOrder (1600)
PROP_Weapon_AmmoUse1 (1)
PROP_Weapon_AmmoGive1 (25)
PROP_Weapon_UpState (S_CSTAFFUP)
PROP_Weapon_DownState (S_CSTAFFDOWN)
PROP_Weapon_ReadyState (S_CSTAFFREADY)
PROP_Weapon_AtkState (S_CSTAFFATK)
PROP_Weapon_Kickback (150)
PROP_Weapon_YAdjust (10)
PROP_Weapon_MoveCombatDist (25000000)
PROP_Weapon_AmmoType1 ("Mana1")
PROP_Weapon_ProjectileType ("CStaffMissile")
PROP_Inventory_PickupMessage("$TXT_WEAPON_C2")
END_DEFAULTS
// Serpent Staff Missile ----------------------------------------------------
class ACStaffMissile : public AActor
{
DECLARE_ACTOR (ACStaffMissile, AActor)
DECLARE_CLASS (ACStaffMissile, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
FState ACStaffMissile::States[] =
{
#define S_CSTAFF_MISSILE1 0
S_BRIGHT (CSSF, 'D', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+1]),
S_BRIGHT (CSSF, 'D', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+2]),
S_BRIGHT (CSSF, 'E', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1+3]),
S_BRIGHT (CSSF, 'E', 1, A_CStaffMissileSlither , &States[S_CSTAFF_MISSILE1]),
#define S_CSTAFF_MISSILE_X1 (S_CSTAFF_MISSILE1+4)
S_BRIGHT (CSSF, 'F', 4, NULL , &States[S_CSTAFF_MISSILE_X1+1]),
S_BRIGHT (CSSF, 'G', 4, NULL , &States[S_CSTAFF_MISSILE_X1+2]),
S_BRIGHT (CSSF, 'H', 3, NULL , &States[S_CSTAFF_MISSILE_X1+3]),
S_BRIGHT (CSSF, 'I', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ACStaffMissile, Hexen, -1, 0)
PROP_SpeedFixed (22)
PROP_RadiusFixed (12)
PROP_HeightFixed (10)
PROP_Damage (5)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_IMPACT|MF2_PCROSS)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_CSTAFF_MISSILE1)
PROP_DeathState (S_CSTAFF_MISSILE_X1)
PROP_DeathSound ("ClericCStaffExplode")
END_DEFAULTS
IMPLEMENT_CLASS (ACStaffMissile)
int ACStaffMissile::DoSpecialDamage (AActor *target, int damage)
{
@ -146,33 +42,6 @@ int ACStaffMissile::DoSpecialDamage (AActor *target, int damage)
return damage;
}
// Serpent Staff Puff -------------------------------------------------------
class ACStaffPuff : public AActor
{
DECLARE_ACTOR (ACStaffPuff, AActor)
};
FState ACStaffPuff::States[] =
{
S_NORMAL (FHFX, 'S', 4, NULL , &States[1]),
S_NORMAL (FHFX, 'T', 4, NULL , &States[2]),
S_NORMAL (FHFX, 'U', 4, NULL , &States[3]),
S_NORMAL (FHFX, 'V', 4, NULL , &States[4]),
S_NORMAL (FHFX, 'W', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (ACStaffPuff, Hexen, -1, 0)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY)
PROP_Flags3 (MF3_PUFFONACTORS)
PROP_RenderStyle (STYLE_Translucent)
PROP_Alpha (HX_SHADOW)
PROP_SpawnState (0)
PROP_SeeSound ("ClericCStaffHitThing")
END_DEFAULTS
//============================================================================
//
// A_CStaffCheck
@ -204,7 +73,7 @@ void A_CStaffCheck (AActor *actor)
slope = P_AimLineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), &linetarget);
if (linetarget)
{
P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, RUNTIME_CLASS(ACStaffPuff));
P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, PClass::FindClass ("CStaffPuff"));
pmo->angle = R_PointToAngle2 (pmo->x, pmo->y,
linetarget->x, linetarget->y);
if ((linetarget->player || linetarget->flags3&MF3_ISMONSTER)
@ -216,7 +85,7 @@ void A_CStaffCheck (AActor *actor)
{
pmo->health = player->health = newLife;
}
P_SetPsprite (player, ps_weapon, &ACWeapStaff::States[S_CSTAFFATK2]);
P_SetPsprite (player, ps_weapon, weapon->FindState ("Drain"));
}
if (weapon != NULL)
{
@ -228,7 +97,7 @@ void A_CStaffCheck (AActor *actor)
slope = P_AimLineAttack (player->mo, angle, fixed_t(1.5*MELEERANGE), &linetarget);
if (linetarget)
{
P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, RUNTIME_CLASS(ACStaffPuff));
P_LineAttack (pmo, angle, fixed_t(1.5*MELEERANGE), slope, damage, NAME_Melee, PClass::FindClass ("CStaffPuff"));
pmo->angle = R_PointToAngle2 (pmo->x, pmo->y,
linetarget->x, linetarget->y);
if (linetarget->player || linetarget->flags3&MF3_ISMONSTER)
@ -236,7 +105,7 @@ void A_CStaffCheck (AActor *actor)
newLife = player->health+(damage>>4);
newLife = newLife > 100 ? 100 : newLife;
pmo->health = player->health = newLife;
P_SetPsprite (player, ps_weapon, &ACWeapStaff::States[S_CSTAFFATK2]);
P_SetPsprite (player, ps_weapon, weapon->FindState ("Drain"));
}
weapon->DepleteAmmo (weapon->bAltFire, false);
break;
@ -323,7 +192,7 @@ void A_CStaffCheckBlink (AActor *actor)
{
if (!--actor->special1)
{
P_SetPsprite (actor->player, ps_weapon, &ACWeapStaff::States[S_CSTAFFBLINK]);
P_SetPsprite (actor->player, ps_weapon, actor->FindState ("Blink"));
actor->special1 = (pr_blink()+50)>>2;
}
else

View File

@ -31,7 +31,7 @@ public:
class AHolySpirit : public AActor
{
DECLARE_ACTOR (AHolySpirit, AActor)
DECLARE_CLASS (AHolySpirit, AActor)
public:
bool Slam (AActor *thing);
bool SpecialBlastHandling (AActor *source, fixed_t strength);

View File

@ -267,31 +267,34 @@ bool P_UndoPlayerMorph (player_t *activator, player_t *player, bool force)
// taking events, reset up the face, if any;
// this is only needed for old-skool skins
// and for the original DOOM status bar.
if ((player == &players[consoleplayer]) &&
(strcmp(pmo->GetClass()->Meta.GetMetaString (APMETA_Face), "None") != 0))
if ((player == &players[consoleplayer]))
{
// Assume root-level base skin to begin with
size_t skinindex = 0;
// If a custom skin was in use, then reload it
// or else the base skin for the player class.
if ((unsigned int)player->userinfo.skin >= PlayerClasses.Size () &&
(size_t)player->userinfo.skin < numskins)
const char *face = pmo->GetClass()->Meta.GetMetaString (APMETA_Face);
if (face != NULL && strcmp(face, "None") != 0)
{
skinindex = player->userinfo.skin;
}
else if (PlayerClasses.Size () > 1)
{
const PClass *whatami = player->mo->GetClass();
for (unsigned int i = 0; i < PlayerClasses.Size (); ++i)
// Assume root-level base skin to begin with
size_t skinindex = 0;
// If a custom skin was in use, then reload it
// or else the base skin for the player class.
if ((unsigned int)player->userinfo.skin >= PlayerClasses.Size () &&
(size_t)player->userinfo.skin < numskins)
{
if (PlayerClasses[i].Type == whatami)
skinindex = player->userinfo.skin;
}
else if (PlayerClasses.Size () > 1)
{
const PClass *whatami = player->mo->GetClass();
for (unsigned int i = 0; i < PlayerClasses.Size (); ++i)
{
skinindex = i;
break;
if (PlayerClasses[i].Type == whatami)
{
skinindex = i;
break;
}
}
}
StatusBar->SetFace(&skins[skinindex]);
}
StatusBar->SetFace(&skins[skinindex]);
}
angle = mo->angle >> ANGLETOFINESHIFT;

View File

@ -270,6 +270,13 @@ void recurse_dir(dir_tree_t *tree, const char *dirpath)
{
file_entry_t *entry;
if (strstr(fileinfo.name, ".orig"))
{
// .orig files are left behind by patch.exe and should never be
// added to zdoom.pk3
continue;
}
entry = alloc_file_entry(dirpath, fileinfo.name, fileinfo.time_write);
if (entry == NULL)
{

View File

@ -0,0 +1,237 @@
// Cleric Weapon Piece ------------------------------------------------------
ACTOR ClericWeaponPiece : FourthWeaponPiece native
{
Game Hexen
Inventory.PickupMessage "$TXT_WRAITHVERGE_PIECE"
}
// Cleric Weapon Piece 1 ----------------------------------------------------
ACTOR CWeaponPiece1 : ClericWeaponPiece 18 native
{
Game Hexen
SpawnID 33
+FLOATBOB
States
{
Spawn:
WCH1 A -1
Stop
}
}
// Cleric Weapon Piece 2 ----------------------------------------------------
ACTOR CWeaponPiece2 : ClericWeaponPiece 19 native
{
Game Hexen
SpawnID 34
+FLOATBOB
States
{
Spawn:
WCH2 A -1
Stop
}
}
// Cleric Weapon Piece 3 ----------------------------------------------------
ACTOR CWeaponPiece3 : ClericWeaponPiece 20 native
{
Game Hexen
SpawnID 35
+FLOATBOB
States
{
Spawn:
WCH3 A -1
Stop
}
}
// Wraithverge Drop ---------------------------------------------------------
ACTOR WraithvergeDrop
{
action native A_DropWraithvergePieces();
States
{
Spawn:
TNT1 A 1
TNT1 A 1 A_DropWraithvergePieces
Stop
}
}
// Cleric's Wraithverge (Holy Symbol?) --------------------------------------
ACTOR CWeapWraithverge : ClericWeapon native
{
Weapon.SelectionOrder 3000
+WEAPON.PRIMARY_USES_BOTH
Weapon.AmmoUse1 18
Weapon.AmmoUse2 18
Weapon.AmmoGive1 0
Weapon.AmmoGive2 0
Weapon.KickBack 150
Weapon.AmmoType1 "Mana1"
Weapon.AmmoType2 "Mana2"
Inventory.PickupMessage "$TXT_WEAPON_C4"
action native A_CHolyAttack();
action native A_CHolyPalette();
States
{
Spawn:
TNT1 A -1
Stop
Ready:
CHLY A 1 A_WeaponReady
Loop
Select:
CHLY A 1 A_Raise
Loop
Deselect:
CHLY A 1 A_Lower
Loop
Fire:
CHLY AB 1 Bright Offset (0, 40)
CHLY CD 2 Bright Offset (0, 43)
CHLY E 2 Bright Offset (0, 45)
CHLY F 6 Bright Offset (0, 48) A_CHolyAttack
CHLY GG 2 Bright Offset (0, 40) A_CHolyPalette
CHLY G 2 Offset (0, 36) A_CHolyPalette
Goto Ready
}
}
// Holy Missile -------------------------------------------------------------
ACTOR HolyMissile
{
Speed 30
Radius 15
Height 8
Damage 4
Projectile
-ACTIVATEIMPACT -ACTIVATEPCROSS
+EXTREMEDEATH
action native A_CHolyAttack2();
States
{
Spawn:
SPIR PPPP 3 Bright A_SpawnItemEx("HolyMissilePuff")
Death:
SPIR P 1 Bright A_CHolyAttack2
Stop
}
}
// Holy Missile Puff --------------------------------------------------------
ACTOR HolyMissilePuff
{
Radius 4
Height 8
+NOBLOCKMAP +NOGRAVITY +DROPOFF
+NOTELEPORT
RenderStyle "Translucent"
Alpha 0.4
States
{
Spawn:
SPIR QRSTU 3
Stop
}
}
// Holy Puff ----------------------------------------------------------------
ACTOR HolyPuff
{
+NOBLOCKMAP +NOGRAVITY
RenderStyle Translucent
Alpha 0.6
States
{
Spawn:
SPIR KLMNO 3
Stop
}
}
// Holy Spirit --------------------------------------------------------------
ACTOR HolySpirit native
{
Health 105
Speed 12
Radius 10
Height 6
Damage 3
Projectile
+RIPPER +SEEKERMISSILE
+FOILINVUL +SKYEXPLODE +NOEXPLODEFLOOR +CANBLAST
+EXTREMEDEATH
RenderStyle Translucent
Alpha 0.4
DeathSound "SpiritDie"
action native A_CHolySeek();
action native A_CHolyCheckScream();
States
{
Spawn:
SPIR AAB 2 A_CHolySeek
SPIR B 2 A_CHolyCheckScream
Loop
Death:
SPIR D 4
SPIR E 4 A_Scream
SPIR FGHI 4
Stop
}
}
// Holy Tail ----------------------------------------------------------------
ACTOR HolyTail
{
Radius 1
Height 1
+NOBLOCKMAP +NOGRAVITY +DROPOFF +NOCLIP
+NOTELEPORT
RenderStyle Translucent
Alpha 0.6
action native A_CHolyTail();
States
{
Spawn:
SPIR C 1 A_CHolyTail
Loop
TailTrail:
SPIR D -1
Stop
}
}
// Holy Tail Trail ---------------------------------------------------------
ACTOR HolyTailTrail : HolyTail
{
States
{
Spawn:
Goto TailTrail
}
}

View File

@ -0,0 +1,95 @@
// The Cleric's Serpent Staff -----------------------------------------------
ACTOR CWeapStaff : ClericWeapon 10
{
Game Hexen
SpawnID 32
Weapon.SelectionOrder 1600
Weapon.AmmoUse1 1
Weapon.AmmoGive1 25
Weapon.KickBack 150
Weapon.YAdjust 10
Weapon.AmmoType1 "Mana1"
Inventory.PickupMessage "$TXT_WEAPON_C2"
action native A_CStaffInitBlink();
action native A_CStaffCheckBlink();
action native A_CStaffCheck();
action native A_CStaffAttack();
States
{
Spawn:
WCSS A -1
Stop
Select:
CSSF C 1 A_Raise
Loop
Deselect:
CSSF B 3
CSSF C 4
CSSF C 1 A_Lower
Wait
Ready:
CSSF C 4
CSSF B 3 A_CStaffInitBlink
CSSF AAAAAAA 1 A_WeaponReady
CSSF A 1 A_CStaffCheckBlink
Goto Ready + 2
Fire:
CSSF A 1 Offset (0, 45) A_CStaffCheck
CSSF J 1 Offset (0, 50) A_CStaffAttack
CSSF J 2 Offset (0, 50)
CSSF J 2 Offset (0, 45)
CSSF A 2 Offset (0, 40)
CSSF A 2 Offset (0, 36)
Goto Ready + 2
Blink:
CSSF BBBCCCCCBBB 1 A_WeaponReady
Goto Ready + 2
Drain:
CSSF K 10 Offset (0, 36)
Goto Ready + 2
}
}
// Serpent Staff Missile ----------------------------------------------------
ACTOR CStaffMissile native
{
Speed 22
Radius 12
Height 10
Damage 5
RenderStyle Add
Projectile
DeathSound "ClericCStaffExplode"
States
{
Spawn:
CSSF DDEE 1 Bright A_CStaffMissileSlither
Loop
Death:
CSSF FG 4 Bright
CSSF HI 3 Bright
Stop
}
}
// Serpent Staff Puff -------------------------------------------------------
ACTOR CStaffPuff
{
+NOBLOCKMAP +NOGRAVITY
+PUFFONACTORS
RenderStyle Translucent
Alpha 0.6
SeeSound "ClericCStaffHitThing"
States
{
Spawn:
FHFX STUVW 4
Stop
}
}

View File

@ -94,6 +94,8 @@
#include "actors/hexen/blastradius.txt"
#include "actors/hexen/boostarmor.txt"
#include "actors/hexen/clericflame.txt"
#include "actors/hexen/clericholy.txt"
#include "actors/hexen/clericstaff.txt"
#include "actors/strife/strifeplayer.txt"
#include "actors/strife/beggars.txt"