- Removed FourthWeaponClass and based Hexen's fourth weapons on the generic weapon

pieces.
- Added DECORATE conversions for Hexen's Fighter weapons by Karate Chris.
- Added aWeaponGiver class to generalize the standing AssaultGun.
- converted a_Strifeweapons.cpp to DECORATE, except for the Sigil.


SVN r1129 (trunk)
This commit is contained in:
Christoph Oelckers 2008-08-08 10:24:08 +00:00
parent 6ab69165c7
commit b695330e90
29 changed files with 1109 additions and 586 deletions

View file

@ -1,3 +1,10 @@
August 8, 2008 (Changes by Graf Zahl)
- Removed FourthWeaponClass and based Hexen's fourth weapons on the generic weapon
pieces.
- Added DECORATE conversions for Hexen's Fighter weapons by Karate Chris.
- Added aWeaponGiver class to generalize the standing AssaultGun.
- converted a_Strifeweapons.cpp to DECORATE, except for the Sigil.
August 7, 2008 (Changes by Graf Zahl) August 7, 2008 (Changes by Graf Zahl)
- Converted the rest of a_strifestuff.cpp to DECORATE. - Converted the rest of a_strifestuff.cpp to DECORATE.
- Fixed: AStalker::CheckMeleeRange did not perform all checks of AActor::CheckMeleeRange. - Fixed: AStalker::CheckMeleeRange did not perform all checks of AActor::CheckMeleeRange.

View file

@ -544,7 +544,6 @@ add_executable( zdoom WIN32
g_hexen/a_spike.cpp g_hexen/a_spike.cpp
g_hexen/a_summon.cpp g_hexen/a_summon.cpp
g_hexen/a_teleportother.cpp g_hexen/a_teleportother.cpp
g_hexen/a_weaponpieces.cpp
g_hexen/a_wraith.cpp g_hexen/a_wraith.cpp
g_hexen/hexen_sbar.cpp g_hexen/hexen_sbar.cpp
g_raven/a_artitele.cpp g_raven/a_artitele.cpp

View file

@ -221,7 +221,6 @@ WEAPON(CFlameAttack)
WEAPON(CFlameRotate) WEAPON(CFlameRotate)
ACTOR(CFlamePuff) ACTOR(CFlamePuff)
WEAPON(CFlameMissile) WEAPON(CFlameMissile)
ACTOR(DropWraithvergePieces)
WEAPON(CHolyAttack) WEAPON(CHolyAttack)
WEAPON(CHolyAttack2) WEAPON(CHolyAttack2)
WEAPON(CHolyPalette) WEAPON(CHolyPalette)
@ -243,7 +242,6 @@ ACTOR(LightningRemove)
ACTOR(FreeTargMobj) ACTOR(FreeTargMobj)
ACTOR(LastZap) ACTOR(LastZap)
ACTOR(ZapMimic) ACTOR(ZapMimic)
ACTOR(DropBloodscourgePieces)
WEAPON(MStaffAttack) WEAPON(MStaffAttack)
WEAPON(MStaffPalette) WEAPON(MStaffPalette)
ACTOR(MStaffTrack) ACTOR(MStaffTrack)
@ -264,7 +262,7 @@ WEAPON(FAxeCheckUpG)
WEAPON(FAxeCheckReadyG) WEAPON(FAxeCheckReadyG)
WEAPON(FHammerAttack) WEAPON(FHammerAttack)
WEAPON(FHammerThrow) WEAPON(FHammerThrow)
ACTOR(DropQuietusPieces) ACTOR(DropWeaponPieces)
WEAPON(FSwordAttack) WEAPON(FSwordAttack)
WEAPON(FSwordFlames) WEAPON(FSwordFlames)
ACTOR(Summon) ACTOR(Summon)
@ -324,6 +322,20 @@ ACTOR(StalkerChaseDecide)
ACTOR(StalkerWalk) ACTOR(StalkerWalk)
ACTOR(StalkerAttack) ACTOR(StalkerAttack)
ACTOR(StalkerDrop) ACTOR(StalkerDrop)
ACTOR(JabDagger)
ACTOR(ClearFlash)
ACTOR(ShowElectricFlash)
ACTOR(FireArrow)
ACTOR(FireMiniMissile)
ACTOR(FireFlamer)
ACTOR(FlameDie)
ACTOR(FireMauler1)
ACTOR(FireMauler2Pre)
ACTOR(FireMauler2)
ACTOR(MaulerTorpedoWave)
ACTOR(BurnArea)
ACTOR(Burnination)
ACTOR(FireGrenade)
// Special code pointers for Strife's player - not to be used elsewhere! // Special code pointers for Strife's player - not to be used elsewhere!
ACTOR(ItBurnsItBurns) ACTOR(ItBurnsItBurns)

View file

@ -228,7 +228,6 @@ public:
int inventorytics; int inventorytics;
BYTE CurrentPlayerClass; // class # for this player instance BYTE CurrentPlayerClass; // class # for this player instance
int pieces; // Fourth Weapon pieces
bool backpack; bool backpack;
int frags[MAXPLAYERS]; // kills of other players int frags[MAXPLAYERS]; // kills of other players

View file

@ -6,6 +6,7 @@
#include "p_enemy.h" #include "p_enemy.h"
#include "a_hexenglobal.h" #include "a_hexenglobal.h"
#include "gstrings.h" #include "gstrings.h"
#include "a_weaponpiece.h"
#define BLAST_FULLSTRENGTH 255 #define BLAST_FULLSTRENGTH 255
@ -30,72 +31,41 @@ void SpawnSpiritTail (AActor *spirit);
//========================================================================== //==========================================================================
class AClericWeaponPiece : public AFourthWeaponPiece class AClericWeaponPiece : public AWeaponPiece
{ {
DECLARE_CLASS (AClericWeaponPiece, AFourthWeaponPiece) DECLARE_CLASS (AClericWeaponPiece, AWeaponPiece)
public:
void BeginPlay ();
protected: protected:
bool MatchPlayerClass (AActor *toucher); bool TryPickup (AActor *toucher);
}; };
IMPLEMENT_CLASS (AClericWeaponPiece) IMPLEMENT_CLASS (AClericWeaponPiece)
bool AClericWeaponPiece::MatchPlayerClass (AActor *toucher) bool AClericWeaponPiece::TryPickup (AActor *toucher)
{ {
return !toucher->IsKindOf (PClass::FindClass(NAME_FighterPlayer)) && if (!toucher->IsKindOf (PClass::FindClass(NAME_MagePlayer)) &&
!toucher->IsKindOf (PClass::FindClass(NAME_MagePlayer)); !toucher->IsKindOf (PClass::FindClass(NAME_FighterPlayer)))
} {
return Super::TryPickup(toucher);
}
else
{ // Wrong class, but try to pick up for ammo
if (ShouldStay())
{
// Can't pick up weapons for other classes in coop netplay
return false;
}
//========================================================================== AWeapon * Defaults=(AWeapon*)GetDefaultByType(WeaponClass);
class ACWeaponPiece1 : public AClericWeaponPiece bool gaveSome = !!(toucher->GiveAmmo (Defaults->AmmoType1, Defaults->AmmoGive1) +
{ toucher->GiveAmmo (Defaults->AmmoType2, Defaults->AmmoGive2));
DECLARE_CLASS (ACWeaponPiece1, AClericWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (ACWeaponPiece1) if (gaveSome)
{
void ACWeaponPiece1::BeginPlay () GoAwayAndDie ();
{ }
Super::BeginPlay (); return gaveSome;
PieceValue = WPIECE1<<3; }
}
//==========================================================================
class ACWeaponPiece2 : public AClericWeaponPiece
{
DECLARE_CLASS (ACWeaponPiece2, AClericWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (ACWeaponPiece2)
void ACWeaponPiece2::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE2<<3;
}
//==========================================================================
class ACWeaponPiece3 : public AClericWeaponPiece
{
DECLARE_CLASS (ACWeaponPiece3, AClericWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (ACWeaponPiece3)
void ACWeaponPiece3::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE3<<3;
} }
// Cleric's Wraithverge (Holy Symbol?) -------------------------------------- // Cleric's Wraithverge (Holy Symbol?) --------------------------------------
@ -619,42 +589,6 @@ void A_CHolyCheckScream (AActor *actor)
} }
} }
void AClericWeaponPiece::BeginPlay ()
{
Super::BeginPlay ();
FourthWeaponClass = RUNTIME_CLASS(ACWeapWraithverge);
}
//============================================================================
//
// A_DropWraithvergePieces
//
//============================================================================
void A_DropWraithvergePieces (AActor *actor)
{
static const PClass *pieces[3] =
{
RUNTIME_CLASS(ACWeaponPiece1),
RUNTIME_CLASS(ACWeaponPiece2),
RUNTIME_CLASS(ACWeaponPiece3)
};
for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL)
{
piece->momx = actor->momx + finecosine[fineang];
piece->momy = actor->momy + finesine[fineang];
piece->momz = actor->momz;
piece->flags |= MF_DROPPED;
fineang += FINEANGLES/3;
j = (j == 0) ? (pr_wraithvergedrop() & 1) + 1 : 3-j;
}
}
}
//============================================================================ //============================================================================
// //
// A_ClericAttack // A_ClericAttack

View file

@ -9,83 +9,82 @@
#include "p_pspr.h" #include "p_pspr.h"
#include "gstrings.h" #include "gstrings.h"
#include "a_hexenglobal.h" #include "a_hexenglobal.h"
#include "a_weaponpiece.h"
#include "thingdef/thingdef.h"
static FRandom pr_quietusdrop ("QuietusDrop"); static FRandom pr_quietusdrop ("QuietusDrop");
static FRandom pr_fswordflame ("FSwordFlame"); static FRandom pr_fswordflame ("FSwordFlame");
void A_FSwordAttack (AActor *actor);
void A_DropQuietusPieces (AActor *);
void A_FSwordFlames (AActor *);
//========================================================================== //==========================================================================
class AFighterWeaponPiece : public AFourthWeaponPiece class AFighterWeaponPiece : public AWeaponPiece
{ {
DECLARE_STATELESS_ACTOR (AFighterWeaponPiece, AFourthWeaponPiece) DECLARE_CLASS (AFighterWeaponPiece, AWeaponPiece)
public:
void BeginPlay ();
protected: protected:
bool MatchPlayerClass (AActor *toucher); bool TryPickup (AActor *toucher);
}; };
IMPLEMENT_CLASS (AFighterWeaponPiece) IMPLEMENT_CLASS (AFighterWeaponPiece)
bool AFighterWeaponPiece::MatchPlayerClass (AActor *toucher) bool AFighterWeaponPiece::TryPickup (AActor *toucher)
{ {
return !toucher->IsKindOf (PClass::FindClass(NAME_ClericPlayer)) && if (!toucher->IsKindOf (PClass::FindClass(NAME_ClericPlayer)) &&
!toucher->IsKindOf (PClass::FindClass(NAME_MagePlayer)); !toucher->IsKindOf (PClass::FindClass(NAME_MagePlayer)))
{
return Super::TryPickup(toucher);
}
else
{ // Wrong class, but try to pick up for ammo
if (ShouldStay())
{
// Can't pick up weapons for other classes in coop netplay
return false;
}
AWeapon * Defaults=(AWeapon*)GetDefaultByType(WeaponClass);
bool gaveSome = !!(toucher->GiveAmmo (Defaults->AmmoType1, Defaults->AmmoGive1) +
toucher->GiveAmmo (Defaults->AmmoType2, Defaults->AmmoGive2));
if (gaveSome)
{
GoAwayAndDie ();
}
return gaveSome;
}
} }
//========================================================================== //============================================================================
//
// A_DropQuietusPieces
//
//============================================================================
class AFWeaponPiece1 : public AFighterWeaponPiece void A_DropWeaponPieces (AActor *actor)
{ {
DECLARE_CLASS (AFWeaponPiece1, AFighterWeaponPiece) int index=CheckIndex(3);
public: if (index<0) return;
void BeginPlay ();
};
IMPLEMENT_CLASS (AFWeaponPiece1) for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{
void AFWeaponPiece1::BeginPlay () const PClass *cls = PClass::FindClass((ENamedName)StateParameters[index+j]);
{ if (cls)
Super::BeginPlay (); {
PieceValue = WPIECE1; AActor *piece = Spawn (cls, actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL)
{
piece->momx = actor->momx + finecosine[fineang];
piece->momy = actor->momy + finesine[fineang];
piece->momz = actor->momz;
piece->flags |= MF_DROPPED;
fineang += FINEANGLES/3;
j = (j == 0) ? (pr_quietusdrop() & 1) + 1 : 3-j;
}
}
}
} }
//==========================================================================
class AFWeaponPiece2 : public AFighterWeaponPiece
{
DECLARE_CLASS (AFWeaponPiece2, AFighterWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (AFWeaponPiece2)
void AFWeaponPiece2::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE2;
}
//==========================================================================
class AFWeaponPiece3 : public AFighterWeaponPiece
{
DECLARE_CLASS (AFWeaponPiece3, AFighterWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (AFWeaponPiece3)
void AFWeaponPiece3::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE3;
}
// Fighter Sword Missile ---------------------------------------------------- // Fighter Sword Missile ----------------------------------------------------
@ -154,42 +153,6 @@ void A_FSwordFlames (AActor *actor)
} }
} }
//============================================================================
//
// A_DropQuietusPieces
//
//============================================================================
void A_DropQuietusPieces (AActor *actor)
{
static const PClass *pieces[3] =
{
RUNTIME_CLASS(AFWeaponPiece1),
RUNTIME_CLASS(AFWeaponPiece2),
RUNTIME_CLASS(AFWeaponPiece3)
};
for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL)
{
piece->momx = actor->momx + finecosine[fineang];
piece->momy = actor->momy + finesine[fineang];
piece->momz = actor->momz;
piece->flags |= MF_DROPPED;
fineang += FINEANGLES/3;
j = (j == 0) ? (pr_quietusdrop() & 1) + 1 : 3-j;
}
}
}
void AFighterWeaponPiece::BeginPlay ()
{
Super::BeginPlay ();
FourthWeaponClass = PClass::FindClass ("FWeapQuietus");
}
//============================================================================ //============================================================================
// //
// A_FighterAttack // A_FighterAttack

View file

@ -38,24 +38,6 @@ public:
bool IsOkayToAttack (AActor *link); bool IsOkayToAttack (AActor *link);
}; };
class AFourthWeaponPiece : public AInventory
{
DECLARE_STATELESS_ACTOR (AFourthWeaponPiece, AInventory)
HAS_OBJECT_POINTERS
public:
void Serialize (FArchive &arc);
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
bool ShouldStay ();
void PlayPickupSound (AActor *toucher);
protected:
virtual bool MatchPlayerClass (AActor *toucher);
const PClass *FourthWeaponClass;
int PieceValue;
TObjPtr<AInventory> TempFourthWeapon;
bool PrivateShouldStay ();
};
class AFighterWeapon : public AWeapon class AFighterWeapon : public AWeapon
{ {
DECLARE_STATELESS_ACTOR (AFighterWeapon, AWeapon); DECLARE_STATELESS_ACTOR (AFighterWeapon, AWeapon);

View file

@ -6,6 +6,7 @@
#include "p_enemy.h" #include "p_enemy.h"
#include "a_hexenglobal.h" #include "a_hexenglobal.h"
#include "gstrings.h" #include "gstrings.h"
#include "a_weaponpiece.h"
static FRandom pr_mstafftrack ("MStaffTrack"); static FRandom pr_mstafftrack ("MStaffTrack");
static FRandom pr_bloodscourgedrop ("BloodScourgeDrop"); static FRandom pr_bloodscourgedrop ("BloodScourgeDrop");
@ -20,72 +21,41 @@ static divline_t BlockCheckLine;
//========================================================================== //==========================================================================
class AMageWeaponPiece : public AFourthWeaponPiece class AMageWeaponPiece : public AWeaponPiece
{ {
DECLARE_CLASS (AMageWeaponPiece, AFourthWeaponPiece) DECLARE_CLASS (AMageWeaponPiece, AWeaponPiece)
public:
void BeginPlay ();
protected: protected:
bool MatchPlayerClass (AActor *toucher); bool TryPickup (AActor *toucher);
}; };
IMPLEMENT_CLASS (AMageWeaponPiece) IMPLEMENT_CLASS (AMageWeaponPiece)
bool AMageWeaponPiece::MatchPlayerClass (AActor *toucher) bool AMageWeaponPiece::TryPickup (AActor *toucher)
{ {
return !toucher->IsKindOf (PClass::FindClass(NAME_FighterPlayer)) && if (!toucher->IsKindOf (PClass::FindClass(NAME_ClericPlayer)) &&
!toucher->IsKindOf (PClass::FindClass(NAME_ClericPlayer)); !toucher->IsKindOf (PClass::FindClass(NAME_FighterPlayer)))
} {
return Super::TryPickup(toucher);
}
else
{ // Wrong class, but try to pick up for ammo
if (ShouldStay())
{
// Can't pick up weapons for other classes in coop netplay
return false;
}
//========================================================================== AWeapon * Defaults=(AWeapon*)GetDefaultByType(WeaponClass);
class AMWeaponPiece1 : public AMageWeaponPiece bool gaveSome = !!(toucher->GiveAmmo (Defaults->AmmoType1, Defaults->AmmoGive1) +
{ toucher->GiveAmmo (Defaults->AmmoType2, Defaults->AmmoGive2));
DECLARE_CLASS (AMWeaponPiece1, AMageWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (AMWeaponPiece1) if (gaveSome)
{
void AMWeaponPiece1::BeginPlay () GoAwayAndDie ();
{ }
Super::BeginPlay (); return gaveSome;
PieceValue = WPIECE1<<6; }
}
//==========================================================================
class AMWeaponPiece2 : public AMageWeaponPiece
{
DECLARE_CLASS (AMWeaponPiece2, AMageWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (AMWeaponPiece2)
void AMWeaponPiece2::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE2<<6;
}
//==========================================================================
class AMWeaponPiece3 : public AMageWeaponPiece
{
DECLARE_CLASS (AMWeaponPiece3, AMageWeaponPiece)
public:
void BeginPlay ();
};
IMPLEMENT_CLASS (AMWeaponPiece3)
void AMWeaponPiece3::BeginPlay ()
{
Super::BeginPlay ();
PieceValue = WPIECE3<<6;
} }
// The Mages's Staff (Bloodscourge) ----------------------------------------- // The Mages's Staff (Bloodscourge) -----------------------------------------
@ -283,42 +253,6 @@ void A_MStaffTrack (AActor *actor)
P_SeekerMissile (actor, ANGLE_1*2, ANGLE_1*10); P_SeekerMissile (actor, ANGLE_1*2, ANGLE_1*10);
} }
//============================================================================
//
// A_DropBloodscourgePieces
//
//============================================================================
void A_DropBloodscourgePieces (AActor *actor)
{
static const PClass *pieces[3] =
{
RUNTIME_CLASS(AMWeaponPiece1),
RUNTIME_CLASS(AMWeaponPiece2),
RUNTIME_CLASS(AMWeaponPiece3)
};
for (int i = 0, j = 0, fineang = 0; i < 3; ++i)
{
AActor *piece = Spawn (pieces[j], actor->x, actor->y, actor->z, ALLOW_REPLACE);
if (piece != NULL)
{
piece->momx = actor->momx + finecosine[fineang];
piece->momy = actor->momy + finesine[fineang];
piece->momz = actor->momz;
piece->flags |= MF_DROPPED;
fineang += FINEANGLES/3;
j = (j == 0) ? (pr_bloodscourgedrop() & 1) + 1 : 3-j;
}
}
}
void AMageWeaponPiece::BeginPlay ()
{
Super::BeginPlay ();
FourthWeaponClass = RUNTIME_CLASS(AMWeapBloodscourge);
}
//============================================================================ //============================================================================
// //
// FrontBlockCheck // FrontBlockCheck

View file

@ -1,178 +0,0 @@
#include "actor.h"
#include "gi.h"
#include "m_random.h"
#include "s_sound.h"
#include "d_player.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "a_action.h"
#include "p_pspr.h"
#include "gstrings.h"
#include "a_hexenglobal.h"
#include "sbar.h"
IMPLEMENT_POINTY_CLASS (AFourthWeaponPiece)
DECLARE_POINTER (TempFourthWeapon)
END_POINTERS
BEGIN_STATELESS_DEFAULTS (AFourthWeaponPiece, Hexen, -1, 0)
PROP_Inventory_PickupSound ("misc/w_pkup")
PROP_Inventory_PickupMessage("$TXT_WEAPONPIECE")
END_DEFAULTS
void AFourthWeaponPiece::Serialize (FArchive &arc)
{
Super::Serialize (arc);
arc << FourthWeaponClass << PieceValue << TempFourthWeapon;
}
const char *AFourthWeaponPiece::PickupMessage ()
{
if (TempFourthWeapon != NULL)
{
return TempFourthWeapon->PickupMessage ();
}
else
{
return Super::PickupMessage ();
}
}
bool AFourthWeaponPiece::MatchPlayerClass (AActor *toucher)
{
return true;
}
void AFourthWeaponPiece::PlayPickupSound (AActor *toucher)
{
if (TempFourthWeapon != NULL)
{
// Play the build-sound full volume for all players
S_Sound (toucher, CHAN_ITEM, "WeaponBuild", 1, ATTN_NONE);
}
else
{
Super::PlayPickupSound (toucher);
}
}
//==========================================================================
//
// TryPickupWeaponPiece
//
//==========================================================================
bool AFourthWeaponPiece::TryPickup (AActor *toucher)
{
bool shouldStay;
bool checkAssembled;
bool gaveWeapon;
int gaveMana;
const PClass *mana1 = PClass::FindClass(NAME_Mana1);
const PClass *mana2 = PClass::FindClass(NAME_Mana2);
checkAssembled = true;
gaveWeapon = false;
gaveMana = 0;
shouldStay = PrivateShouldStay ();
if (!MatchPlayerClass (toucher))
{ // Wrong class, but try to pick up for mana
if (shouldStay)
{ // Can't pick up wrong-class weapons in coop netplay
return false;
}
checkAssembled = false;
gaveMana = toucher->GiveAmmo (mana1, 20) +
toucher->GiveAmmo (mana2, 20);
if (!gaveMana)
{ // Didn't need the mana, so don't pick it up
return false;
}
}
else if (shouldStay)
{ // Cooperative net-game
if (toucher->player->pieces & PieceValue)
{ // Already has the piece
return false;
}
toucher->GiveAmmo (mana1, 20);
toucher->GiveAmmo (mana2, 20);
}
else
{ // Deathmatch or singleplayer game
gaveMana = toucher->GiveAmmo (mana1, 20) +
toucher->GiveAmmo (mana2, 20);
if (toucher->player->pieces & PieceValue)
{ // Already has the piece, check if mana needed
if (!gaveMana)
{ // Didn't need the mana, so don't pick it up
return false;
}
checkAssembled = false;
}
}
// Check if fourth weapon assembled
if (checkAssembled)
{
toucher->player->pieces |= PieceValue;
for (int i = 0; i < 9; i += 3)
{
int mask = (WPIECE1|WPIECE2|WPIECE3) << i;
if (PieceValue & mask)
{
if (toucher->CheckLocalView (consoleplayer))
{
StatusBar->SetInteger (0, i);
}
if ((toucher->player->pieces & mask) == mask)
{
gaveWeapon = (FourthWeaponClass != NULL);
}
break;
}
}
}
if (gaveWeapon)
{
TempFourthWeapon = static_cast<AInventory *>(Spawn (FourthWeaponClass, x, y, z, NO_REPLACE));
if (TempFourthWeapon != NULL)
{
gaveWeapon = TempFourthWeapon->TryPickup (toucher);
if (!gaveWeapon)
{
TempFourthWeapon->GoAwayAndDie ();
}
}
else
{
gaveWeapon = false;
}
}
if (gaveWeapon || gaveMana || checkAssembled)
{
GoAwayAndDie ();
}
return gaveWeapon || gaveMana || checkAssembled;
}
bool AFourthWeaponPiece::ShouldStay ()
{
return PrivateShouldStay ();
}
bool AFourthWeaponPiece::PrivateShouldStay ()
{
// We want a weapon piece to behave like a weapon, so follow the exact
// same logic as weapons when deciding whether or not to stay.
if (((multiplayer &&
(!deathmatch && !alwaysapplydmflags)) || (dmflags & DF_WEAPONS_STAY)) &&
!(flags & MF_DROPPED))
{
return true;
}
return false;
}

View file

@ -15,6 +15,7 @@
#include "a_hexenglobal.h" #include "a_hexenglobal.h"
#include "a_keys.h" #include "a_keys.h"
#include "r_translate.h" #include "r_translate.h"
#include "a_weaponpiece.h"
class FManaBar : public FTexture class FManaBar : public FTexture
@ -316,34 +317,22 @@ public:
{ {
if (player->mo->IsKindOf (PClass::FindClass(NAME_MagePlayer))) if (player->mo->IsKindOf (PClass::FindClass(NAME_MagePlayer)))
{ {
FourthWeaponShift = 6;
FourthWeaponClass = 2; FourthWeaponClass = 2;
LifeBarClass = 2; LifeBarClass = 2;
} }
else if (player->mo->IsKindOf (PClass::FindClass(NAME_ClericPlayer))) else if (player->mo->IsKindOf (PClass::FindClass(NAME_ClericPlayer)))
{ {
FourthWeaponShift = 3;
FourthWeaponClass = 1; FourthWeaponClass = 1;
LifeBarClass = 1; LifeBarClass = 1;
} }
else else
{ {
FourthWeaponShift = 0;
FourthWeaponClass = 0; FourthWeaponClass = 0;
LifeBarClass = 0; LifeBarClass = 0;
} }
} }
} }
void SetInteger (int pname, int param)
{
if (pname == 0)
{
FourthWeaponShift = param;
FourthWeaponClass = param / 3;
}
}
private: private:
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// //
@ -502,11 +491,7 @@ private:
} }
// Weapon Pieces // Weapon Pieces
if (oldpieces != CPlayer->pieces) DrawWeaponPieces();
{
DrawWeaponPieces();
oldpieces = CPlayer->pieces;
}
} }
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -849,32 +834,57 @@ private:
void DrawWeaponPieces () void DrawWeaponPieces ()
{ {
static int PieceX[3][3] = static ENamedName FourthWeaponNames[] = { NAME_FWeapQuietus, NAME_CWeapWraithverge, NAME_MWeapBloodscourge };
{
{ 190, 225, 234 },
{ 190, 212, 225 },
{ 190, 205, 224 },
};
int pieces = (CPlayer->pieces >> FourthWeaponShift) & 7;
int weapClass = FourthWeaponClass;
if (pieces == 7) for(AInventory *inv = CPlayer->mo->Inventory; inv != NULL; inv = inv->Inventory)
{ {
DrawImage (ClassImages[weapClass][imgWEAPONFULL], 190, 0); if (inv->IsA(RUNTIME_CLASS(AWeaponHolder)))
return; {
AWeaponHolder *hold = static_cast<AWeaponHolder*>(inv);
if (hold->PieceWeapon->TypeName == FourthWeaponNames[FourthWeaponClass])
{
// Weapon Pieces
if (oldpieces != hold->PieceMask)
{
oldpieces = hold->PieceMask;
static int PieceX[3][3] =
{
{ 190, 225, 234 },
{ 190, 212, 225 },
{ 190, 205, 224 },
};
int pieces = oldpieces;
int weapClass = FourthWeaponClass;
if (pieces == 7)
{
DrawImage (ClassImages[weapClass][imgWEAPONFULL], 190, 0);
return;
}
DrawImage (ClassImages[weapClass][imgWEAPONSLOT], 190, 0);
if (pieces & WPIECE1)
{
DrawImage (ClassImages[weapClass][imgPIECE1], PieceX[weapClass][0], 0);
}
if (pieces & WPIECE2)
{
DrawImage (ClassImages[weapClass][imgPIECE2], PieceX[weapClass][1], 0);
}
if (pieces & WPIECE3)
{
DrawImage (ClassImages[weapClass][imgPIECE3], PieceX[weapClass][2], 0);
}
}
return;
}
}
} }
DrawImage (ClassImages[weapClass][imgWEAPONSLOT], 190, 0); if (oldpieces != 0)
if (pieces & WPIECE1)
{ {
DrawImage (ClassImages[weapClass][imgPIECE1], PieceX[weapClass][0], 0); DrawImage (ClassImages[FourthWeaponClass][imgWEAPONSLOT], 190, 0);
} oldpieces = 0;
if (pieces & WPIECE2)
{
DrawImage (ClassImages[weapClass][imgPIECE2], PieceX[weapClass][1], 0);
}
if (pieces & WPIECE3)
{
DrawImage (ClassImages[weapClass][imgPIECE3], PieceX[weapClass][2], 0);
} }
} }
@ -1144,7 +1154,6 @@ private:
int HealthMarker; int HealthMarker;
char ArtifactFlash; char ArtifactFlash;
char FourthWeaponShift;
char FourthWeaponClass; char FourthWeaponClass;
char LifeBarClass; char LifeBarClass;

View file

@ -1249,7 +1249,7 @@ bool AInventory::TryPickup (AActor *toucher)
{ {
// Add the item to the inventory. It is not already there, or HandlePickup // Add the item to the inventory. It is not already there, or HandlePickup
// would have already taken care of it. // would have already taken care of it.
AInventory *copy = CreeCopy (toucher); AInventory *copy = CreateCopy (toucher);
if (copy == NULL) if (copy == NULL)
{ {
return false; return false;

View file

@ -13,6 +13,7 @@
#include "cmdlib.h" #include "cmdlib.h"
#include "templates.h" #include "templates.h"
#include "sbar.h" #include "sbar.h"
#include "thingdef/thingdef.h"
#define BONUSADD 6 #define BONUSADD 6
@ -579,6 +580,40 @@ FState *AWeapon::GetAltAtkState (bool hold)
return state; return state;
} }
/* Weapon giver ***********************************************************/
class AWeaponGiver : public AWeapon
{
DECLARE_STATELESS_ACTOR(AWeaponGiver, AWeapon)
public:
bool TryPickup(AActor *toucher);
};
IMPLEMENT_ABSTRACT_ACTOR(AWeaponGiver)
bool AWeaponGiver::TryPickup(AActor *toucher)
{
FDropItem *di = GetDropItems(GetClass());
if (di != NULL)
{
const PClass *ti = PClass::FindClass(di->Name);
if (ti->IsDescendantOf(RUNTIME_CLASS(AWeapon)))
{
AWeapon *weap = static_cast<AWeapon*>(Spawn(di->Name, 0, 0, 0, NO_REPLACE));
if (weap != NULL)
{
bool res = weap->TryPickup(toucher);
if (!res) weap->Destroy();
else GoAwayAndDie();
return res;
}
}
}
return false;
}
/* Weapon slots ***********************************************************/ /* Weapon slots ***********************************************************/
FWeaponSlots LocalWeapons; FWeaponSlots LocalWeapons;

View file

@ -24,7 +24,7 @@ void A_ReaverRanged (AActor *self)
{ {
angle_t angle = bangle + (pr_reaverattack.Random2() << 20); angle_t angle = bangle + (pr_reaverattack.Random2() << 20);
int damage = ((pr_reaverattack() & 7) + 1) * 3; int damage = ((pr_reaverattack() & 7) + 1) * 3;
P_LineAttack (self, angle, MISSILERANGE, pitch, damage, NAME_None, RUNTIME_CLASS(AStrifePuff)); P_LineAttack (self, angle, MISSILERANGE, pitch, damage, NAME_None, NAME_StrifePuff);
} }
} }
} }

View file

@ -28,7 +28,7 @@ void A_ShootGun (AActor *self)
pitch = P_AimLineAttack (self, self->angle, MISSILERANGE); pitch = P_AimLineAttack (self, self->angle, MISSILERANGE);
P_LineAttack (self, self->angle + (pr_shootgun.Random2() << 19), P_LineAttack (self, self->angle + (pr_shootgun.Random2() << 19),
MISSILERANGE, pitch, MISSILERANGE, pitch,
3*(pr_shootgun() % 5 + 1), NAME_None, RUNTIME_CLASS(AStrifePuff)); 3*(pr_shootgun() % 5 + 1), NAME_None, NAME_StrifePuff);
} }
// Teleporter Beacon -------------------------------------------------------- // Teleporter Beacon --------------------------------------------------------

View file

@ -7,21 +7,6 @@
// Base class for every humanoid in Strife that can go into // Base class for every humanoid in Strife that can go into
// a fire or electric death. // a fire or electric death.
class AStrifeHumanoid : public AActor
{
DECLARE_ACTOR (AStrifeHumanoid, AActor)
};
class AStrifePuff : public AActor
{
DECLARE_ACTOR (AStrifePuff, AActor)
};
class AFlameMissile : public AActor
{
DECLARE_ACTOR (AFlameMissile, AActor)
};
class ADegninOre : public AInventory class ADegninOre : public AInventory
{ {
DECLARE_ACTOR (ADegninOre, AInventory) DECLARE_ACTOR (ADegninOre, AInventory)
@ -68,7 +53,7 @@ public:
class ASigil : public AWeapon class ASigil : public AWeapon
{ {
DECLARE_ACTOR (ASigil, AStrifeWeapon) DECLARE_ACTOR (ASigil, AWeapon)
public: public:
bool HandlePickup (AInventory *item); bool HandlePickup (AInventory *item);
AInventory *CreateCopy (AActor *other); AInventory *CreateCopy (AActor *other);

View file

@ -5,6 +5,7 @@
#include "s_sound.h" #include "s_sound.h"
#include "p_enemy.h" #include "p_enemy.h"
#include "templates.h" #include "templates.h"
#include "thingdef/thingdef.h"
// Note: Strife missiles do 1-4 times their damage amount. // Note: Strife missiles do 1-4 times their damage amount.
// Doom missiles do 1-8 times their damage amount, so to // Doom missiles do 1-8 times their damage amount, so to
@ -262,7 +263,7 @@ void P_StrifeGunShot (AActor *mo, bool accurate, angle_t pitch)
angle += pr_sgunshot.Random2() << (20 - mo->player->accuracy * 5 / 100); angle += pr_sgunshot.Random2() << (20 - mo->player->accuracy * 5 / 100);
} }
P_LineAttack (mo, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, RUNTIME_CLASS(AStrifePuff)); P_LineAttack (mo, angle, PLAYERMISSILERANGE, pitch, damage, NAME_None, NAME_StrifePuff);
} }
//============================================================================ //============================================================================
@ -322,7 +323,7 @@ void A_FireMiniMissile (AActor *self)
savedangle = self->angle; savedangle = self->angle;
self->angle += pr_minimissile.Random2() << (19 - player->accuracy * 5 / 100); self->angle += pr_minimissile.Random2() << (19 - player->accuracy * 5 / 100);
player->mo->PlayAttacking2 (); player->mo->PlayAttacking2 ();
P_SpawnPlayerMissile (self, RUNTIME_CLASS(AMiniMissile)); P_SpawnPlayerMissile (self, PClass::FindClass("MiniMissile"));
self->angle = savedangle; self->angle = savedangle;
} }
@ -337,8 +338,8 @@ void A_RocketInFlight (AActor *self)
AActor *trail; AActor *trail;
S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM); S_Sound (self, CHAN_VOICE, "misc/missileinflight", 1, ATTN_NORM);
P_SpawnPuff (self, RUNTIME_CLASS(AMiniMissilePuff), self->x, self->y, self->z, self->angle - ANGLE_180, 2, PF_HITTHING); P_SpawnPuff (self, PClass::FindClass("MiniMissilePuff"), self->x, self->y, self->z, self->angle - ANGLE_180, 2, PF_HITTHING);
trail = Spawn<ARocketTrail> (self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE); trail = Spawn("RocketTrail", self->x - self->momx, self->y - self->momy, self->z, ALLOW_REPLACE);
if (trail != NULL) if (trail != NULL)
{ {
trail->momz = FRACUNIT; trail->momz = FRACUNIT;
@ -381,7 +382,7 @@ void A_FireFlamer (AActor *self)
} }
self->angle += pr_flamethrower.Random2() << 18; self->angle += pr_flamethrower.Random2() << 18;
self = P_SpawnPlayerMissile (self, RUNTIME_CLASS(AFlameMissile)); self = P_SpawnPlayerMissile (self, PClass::FindClass("FlameMissile"));
if (self != NULL) if (self != NULL)
{ {
self->momz += 5*FRACUNIT; self->momz += 5*FRACUNIT;
@ -428,7 +429,7 @@ void A_FireMauler1 (AActor *self)
// it should use a different puff. ZDoom's default range is longer // it should use a different puff. ZDoom's default range is longer
// than this, so let's not handicap it by being too faithful to the // than this, so let's not handicap it by being too faithful to the
// original. // original.
P_LineAttack (self, angle, PLAYERMISSILERANGE, pitch, damage, NAME_Disintegrate, RUNTIME_CLASS(AMaulerPuff)); P_LineAttack (self, angle, PLAYERMISSILERANGE, pitch, damage, NAME_Disintegrate, NAME_MaulerPuff);
} }
} }
@ -471,7 +472,7 @@ void A_FireMauler2 (AActor *self)
} }
self->player->mo->PlayAttacking2 (); self->player->mo->PlayAttacking2 ();
} }
P_SpawnPlayerMissile (self, RUNTIME_CLASS(AMaulerTorpedo)); P_SpawnPlayerMissile (self, PClass::FindClass("MaulerTorpedo"));
P_DamageMobj (self, self, NULL, 20, self->DamageType); P_DamageMobj (self, self, NULL, 20, self->DamageType);
P_ThrustMobj (self, self->angle + ANGLE_180, 0x7D000); P_ThrustMobj (self, self->angle + ANGLE_180, 0x7D000);
} }
@ -488,20 +489,21 @@ AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target);
void A_MaulerTorpedoWave (AActor *self) void A_MaulerTorpedoWave (AActor *self)
{ {
AActor *wavedef = GetDefaultByName("MaulerTorpedoWave");
fixed_t savedz; fixed_t savedz;
self->angle += ANGLE_180; self->angle += ANGLE_180;
// If the torpedo hit the ceiling, it should still spawn the wave // If the torpedo hit the ceiling, it should still spawn the wave
savedz = self->z; savedz = self->z;
if (self->ceilingz - self->z < GetDefault<AMaulerTorpedoWave>()->height) if (wavedef && self->ceilingz - self->z < wavedef->height)
{ {
self->z = self->ceilingz - GetDefault<AMaulerTorpedoWave>()->height; self->z = self->ceilingz - wavedef->height;
} }
for (int i = 0; i < 80; ++i) for (int i = 0; i < 80; ++i)
{ {
self->angle += ANGLE_45/10; self->angle += ANGLE_45/10;
P_SpawnSubMissile (self, RUNTIME_CLASS(AMaulerTorpedoWave), self->target); P_SpawnSubMissile (self, PClass::FindClass("MaulerTorpedoWave"), self->target);
} }
self->z = savedz; self->z = savedz;
} }
@ -546,6 +548,15 @@ AActor *P_SpawnSubMissile (AActor *source, const PClass *type, AActor *target)
return NULL; return NULL;
} }
class APhosphorousFire : public AActor
{
DECLARE_CLASS (APhosphorousFire, AActor)
public:
int DoSpecialDamage (AActor *target, int damage);
};
IMPLEMENT_CLASS (APhosphorousFire)
int APhosphorousFire::DoSpecialDamage (AActor *target, int damage) int APhosphorousFire::DoSpecialDamage (AActor *target, int damage)
{ {
if (target->flags & MF_NOBLOOD) if (target->flags & MF_NOBLOOD)
@ -623,7 +634,7 @@ void A_Burnination (AActor *self)
void A_FireGrenade (AActor *self) void A_FireGrenade (AActor *self)
{ {
PClass *grenadetype; const PClass *grenadetype;
player_t *player = self->player; player_t *player = self->player;
AActor *grenade; AActor *grenade;
angle_t an; angle_t an;

View file

@ -27,6 +27,6 @@ void A_TemplarAttack (AActor *self)
damage = (pr_templar() & 4) * 2; damage = (pr_templar() & 4) * 2;
angle = self->angle + (pr_templar.Random2() << 19); angle = self->angle + (pr_templar.Random2() << 19);
pitchdiff = pr_templar.Random2() * 332063; pitchdiff = pr_templar.Random2() * 332063;
P_LineAttack (self, angle, MISSILERANGE+64*FRACUNIT, pitch+pitchdiff, damage, NAME_Disintegrate, "MaulerPuff"); P_LineAttack (self, angle, MISSILERANGE+64*FRACUNIT, pitch+pitchdiff, damage, NAME_Disintegrate, NAME_MaulerPuff);
} }
} }

View file

@ -53,6 +53,8 @@ xx(DoorMetal2)
xx(Wind) xx(Wind)
xx(BulletPuff) xx(BulletPuff)
xx(StrifePuff)
xx(MaulerPuff)
// Special bosses A_BossDeath knows about // Special bosses A_BossDeath knows about
xx(Fatso) xx(Fatso)
@ -106,6 +108,11 @@ xx(Cell)
xx(Mana1) xx(Mana1)
xx(Mana2) xx(Mana2)
// Hexen's fourth weapons
xx(FWeapQuietus)
xx(CWeapWraithverge)
xx(MWeapBloodscourge)
// Ammo and weapon names for the Strife status bar // Ammo and weapon names for the Strife status bar
xx(ClipOfBullets) xx(ClipOfBullets)
xx(PoisonBolts) xx(PoisonBolts)

View file

@ -571,9 +571,9 @@ void FBehavior::StaticLoadDefaultModules ()
} }
} }
FBehavior *FBehavior::StaticLoadModule (int lumpnum, FileReader * fr, int len) FBehavior *FBehavior::StaticLoadModule (int lumpnum, FileReader *fr, int len)
{ {
if (lumpnum == -1) return NULL; if (lumpnum == -1 && fr == NULL) return NULL;
for (unsigned int i = 0; i < StaticModules.Size(); ++i) for (unsigned int i = 0; i < StaticModules.Size(); ++i)
{ {

View file

@ -1148,7 +1148,7 @@ void P_ConversationCommand (int player, BYTE **stream)
level.total_items--; level.total_items--;
item->flags &= ~MF_COUNTITEM; item->flags &= ~MF_COUNTITEM;
} }
if (item->IsA(RUNTIME_CLASS(AFlameThrower))) if (item->GetClass()->TypeName == NAME_FlameThrower)
{ {
// The flame thrower gives less ammo when given in a dialog // The flame thrower gives less ammo when given in a dialog
static_cast<AWeapon*>(item)->AmmoGive1 = 40; static_cast<AWeapon*>(item)->AmmoGive1 = 40;

View file

@ -220,7 +220,6 @@ player_t::player_t()
health(0), health(0),
inventorytics(0), inventorytics(0),
CurrentPlayerClass(0), CurrentPlayerClass(0),
pieces(0),
backpack(0), backpack(0),
fragcount(0), fragcount(0),
lastkilltime(0), lastkilltime(0),
@ -2421,7 +2420,6 @@ void player_t::Serialize (FArchive &arc)
<< centering << centering
<< health << health
<< inventorytics << inventorytics
<< pieces
<< backpack << backpack
<< fragcount << fragcount
<< spreecount << spreecount

View file

@ -75,7 +75,7 @@
// SAVESIG should match SAVEVER. // SAVESIG should match SAVEVER.
// MINSAVEVER is the minimum level snapshot version that can be loaded. // MINSAVEVER is the minimum level snapshot version that can be loaded.
#define MINSAVEVER 1114 #define MINSAVEVER 1129
#if SVN_REVISION_NUMBER < MINSAVEVER #if SVN_REVISION_NUMBER < MINSAVEVER
// Never write a savegame with a version lower than what we need // Never write a savegame with a version lower than what we need

View file

@ -1,19 +1,21 @@
// Cleric Weapon Piece ------------------------------------------------------ // Cleric Weapon Piece ------------------------------------------------------
ACTOR ClericWeaponPiece : FourthWeaponPiece native ACTOR ClericWeaponPiece : WeaponPiece native
{ {
Game Hexen
Inventory.PickupMessage "$TXT_WRAITHVERGE_PIECE" Inventory.PickupMessage "$TXT_WRAITHVERGE_PIECE"
} }
// Cleric Weapon Piece 1 ---------------------------------------------------- // Cleric Weapon Piece 1 ----------------------------------------------------
ACTOR CWeaponPiece1 : ClericWeaponPiece 18 native ACTOR CWeaponPiece1 : ClericWeaponPiece 18
{ {
Game Hexen Game Hexen
SpawnID 33 SpawnID 33
+FLOATBOB +FLOATBOB
Inventory.PickupMessage "$TXT_WRAITHVERGE_PIECE"
WeaponPiece.Number 1
WeaponPiece.Weapon CWeapWraithverge
States States
{ {
Spawn: Spawn:
@ -24,11 +26,12 @@ ACTOR CWeaponPiece1 : ClericWeaponPiece 18 native
// Cleric Weapon Piece 2 ---------------------------------------------------- // Cleric Weapon Piece 2 ----------------------------------------------------
ACTOR CWeaponPiece2 : ClericWeaponPiece 19 native ACTOR CWeaponPiece2 : CWeaponPiece1 19
{ {
Game Hexen Game Hexen
SpawnID 34 SpawnID 34
+FLOATBOB +FLOATBOB
WeaponPiece.Number 2
States States
{ {
Spawn: Spawn:
@ -39,11 +42,12 @@ ACTOR CWeaponPiece2 : ClericWeaponPiece 19 native
// Cleric Weapon Piece 3 ---------------------------------------------------- // Cleric Weapon Piece 3 ----------------------------------------------------
ACTOR CWeaponPiece3 : ClericWeaponPiece 20 native ACTOR CWeaponPiece3 : CWeaponPiece1 20
{ {
Game Hexen Game Hexen
SpawnID 35 SpawnID 35
+FLOATBOB +FLOATBOB
WeaponPiece.Number 3
States States
{ {
Spawn: Spawn:
@ -56,13 +60,11 @@ ACTOR CWeaponPiece3 : ClericWeaponPiece 20 native
ACTOR WraithvergeDrop ACTOR WraithvergeDrop
{ {
action native A_DropWraithvergePieces();
States States
{ {
Spawn: Spawn:
TNT1 A 1 TNT1 A 1
TNT1 A 1 A_DropWraithvergePieces TNT1 A 1 A_DropWeaponPieces("CWeaponPiece1", "CWeaponPiece2", "CWeaponPiece3")
Stop Stop
} }
} }
@ -71,16 +73,18 @@ ACTOR WraithvergeDrop
ACTOR CWeapWraithverge : ClericWeapon native ACTOR CWeapWraithverge : ClericWeapon native
{ {
Health 3
Weapon.SelectionOrder 3000 Weapon.SelectionOrder 3000
+WEAPON.PRIMARY_USES_BOTH +WEAPON.PRIMARY_USES_BOTH
Weapon.AmmoUse1 18 Weapon.AmmoUse1 18
Weapon.AmmoUse2 18 Weapon.AmmoUse2 18
Weapon.AmmoGive1 0 Weapon.AmmoGive1 20
Weapon.AmmoGive2 0 Weapon.AmmoGive2 20
Weapon.KickBack 150 Weapon.KickBack 150
Weapon.AmmoType1 "Mana1" Weapon.AmmoType1 "Mana1"
Weapon.AmmoType2 "Mana2" Weapon.AmmoType2 "Mana2"
Inventory.PickupMessage "$TXT_WEAPON_C4" Inventory.PickupMessage "$TXT_WEAPON_C4"
Inventory.PickupSound "WeaponBuild"
action native A_CHolyAttack(); action native A_CHolyAttack();
action native A_CHolyPalette(); action native A_CHolyPalette();

View file

@ -1,17 +1,19 @@
// Fighter Weapon Piece ----------------------------------------------------- // Fighter Weapon Piece -----------------------------------------------------
ACTOR FighterWeaponPiece : FourthWeaponPiece native ACTOR FighterWeaponPiece : WeaponPiece native
{ {
Inventory.PickupMessage "$TXT_QUIETUS_PIECE"
} }
// Fighter Weapon Piece 1 --------------------------------------------------- // Fighter Weapon Piece 1 ---------------------------------------------------
ACTOR FWeaponPiece1 : FighterWeaponPiece 12 native ACTOR FWeaponPiece1 : FighterWeaponPiece 12
{ {
Game Hexen Game Hexen
SpawnID 29 SpawnID 29
Inventory.PickupMessage "$TXT_QUIETUS_PIECE"
WeaponPiece.Number 1
WeaponPiece.Weapon FWeapQuietus
+FLOATBOB +FLOATBOB
States States
{ {
@ -23,10 +25,11 @@ ACTOR FWeaponPiece1 : FighterWeaponPiece 12 native
// Fighter Weapon Piece 2 --------------------------------------------------- // Fighter Weapon Piece 2 ---------------------------------------------------
ACTOR FWeaponPiece2 : FighterWeaponPiece 13 native ACTOR FWeaponPiece2 : FWeaponPiece1 13
{ {
Game Hexen Game Hexen
SpawnID 30 SpawnID 30
WeaponPiece.Number 2
+FLOATBOB +FLOATBOB
States States
{ {
@ -38,10 +41,11 @@ ACTOR FWeaponPiece2 : FighterWeaponPiece 13 native
// Fighter Weapon Piece 3 --------------------------------------------------- // Fighter Weapon Piece 3 ---------------------------------------------------
ACTOR FWeaponPiece3 : FighterWeaponPiece 16 native ACTOR FWeaponPiece3 : FWeaponPiece1 16
{ {
Game Hexen Game Hexen
SpawnID 31 SpawnID 31
WeaponPiece.Number 3
+FLOATBOB +FLOATBOB
States States
{ {
@ -55,13 +59,11 @@ ACTOR FWeaponPiece3 : FighterWeaponPiece 16 native
ACTOR QuietusDrop ACTOR QuietusDrop
{ {
action native A_DropQuietusPieces();
States States
{ {
Spawn: Spawn:
TNT1 A 1 TNT1 A 1
TNT1 A 1 A_DropQuietusPieces TNT1 A 1 A_DropWeaponPieces("FWeaponPiece1", "FWeaponPiece2", "FWeaponPiece3")
Stop Stop
} }
} }
@ -70,17 +72,19 @@ ACTOR QuietusDrop
ACTOR FWeapQuietus : FighterWeapon ACTOR FWeapQuietus : FighterWeapon
{ {
Health 3
Weapon.SelectionOrder 2900 Weapon.SelectionOrder 2900
+WEAPON.PRIMARY_USES_BOTH +WEAPON.PRIMARY_USES_BOTH
Weapon.AmmoUse1 14 Weapon.AmmoUse1 14
Weapon.AmmoUse2 14 Weapon.AmmoUse2 14
Weapon.AmmoGive1 0 Weapon.AmmoGive1 20
Weapon.AmmoGive2 0 Weapon.AmmoGive2 20
Weapon.KickBack 150 Weapon.KickBack 150
Weapon.YAdjust 10 Weapon.YAdjust 10
Weapon.AmmoType1 "Mana1" Weapon.AmmoType1 "Mana1"
Weapon.AmmoType2 "Mana2" Weapon.AmmoType2 "Mana2"
Inventory.PickupMessage "$TXT_WEAPON_F4" Inventory.PickupMessage "$TXT_WEAPON_F4"
Inventory.PickupSound "WeaponBuild"
action native A_FSwordAttack(); action native A_FSwordAttack();

View file

@ -1,18 +1,20 @@
// Mage Weapon Piece -------------------------------------------------------- // Mage Weapon Piece --------------------------------------------------------
ACTOR MageWeaponPiece : FourthWeaponPiece native ACTOR MageWeaponPiece : WeaponPiece native
{ {
Inventory.PickupMessage "$TXT_BLOODSCOURGE_PIECE"
} }
// Mage Weapon Piece 1 ------------------------------------------------------ // Mage Weapon Piece 1 ------------------------------------------------------
ACTOR MWeaponPiece1 : MageWeaponPiece 21 native ACTOR MWeaponPiece1 : MageWeaponPiece 21
{ {
Game Hexen Game Hexen
SpawnID 37 SpawnID 37
+FLOATBOB +FLOATBOB
Inventory.PickupMessage "$TXT_BLOODSCOURGE_PIECE"
WeaponPiece.Number 1
WeaponPiece.Weapon MWeapBloodscourge
States States
{ {
Spawn: Spawn:
@ -23,11 +25,12 @@ ACTOR MWeaponPiece1 : MageWeaponPiece 21 native
// Mage Weapon Piece 2 ------------------------------------------------------ // Mage Weapon Piece 2 ------------------------------------------------------
ACTOR MWeaponPiece2 : MageWeaponPiece 22 native ACTOR MWeaponPiece2 : MWeaponPiece1 22
{ {
Game Hexen Game Hexen
SpawnID 38 SpawnID 38
+FLOATBOB +FLOATBOB
WeaponPiece.Number 2
States States
{ {
Spawn: Spawn:
@ -38,11 +41,12 @@ ACTOR MWeaponPiece2 : MageWeaponPiece 22 native
// Mage Weapon Piece 3 ------------------------------------------------------ // Mage Weapon Piece 3 ------------------------------------------------------
ACTOR MWeaponPiece3 : MageWeaponPiece 23 native ACTOR MWeaponPiece3 : MWeaponPiece1 23
{ {
Game Hexen Game Hexen
SpawnID 39 SpawnID 39
+FLOATBOB +FLOATBOB
WeaponPiece.Number 3
States States
{ {
Spawn: Spawn:
@ -55,13 +59,11 @@ ACTOR MWeaponPiece3 : MageWeaponPiece 23 native
ACTOR BloodscourgeDrop ACTOR BloodscourgeDrop
{ {
action native A_DropBloodscourgePieces();
States States
{ {
Spawn: Spawn:
TNT1 A 1 TNT1 A 1
TNT1 A 1 A_DropBloodscourgePieces TNT1 A 1 A_DropWeaponPieces("MWeaponPiece1", "MWeaponPiece2", "MWeaponPiece3")
Stop Stop
} }
} }
@ -70,15 +72,19 @@ ACTOR BloodscourgeDrop
ACTOR MWeapBloodscourge : MageWeapon native ACTOR MWeapBloodscourge : MageWeapon native
{ {
Health 3
Weapon.SelectionOrder 3100 Weapon.SelectionOrder 3100
Weapon.AmmoUse1 15 Weapon.AmmoUse1 15
Weapon.AmmoUse2 15 Weapon.AmmoUse2 15
Weapon.AmmoGive1 20
Weapon.AmmoGive2 20
Weapon.KickBack 150 Weapon.KickBack 150
Weapon.YAdjust 20 Weapon.YAdjust 20
Weapon.AmmoType1 "Mana1" Weapon.AmmoType1 "Mana1"
Weapon.AmmoType2 "Mana2" Weapon.AmmoType2 "Mana2"
+WEAPON.PRIMARY_USES_BOTH +WEAPON.PRIMARY_USES_BOTH
Inventory.PickupMessage "$TXT_WEAPON_M4" Inventory.PickupMessage "$TXT_WEAPON_M4"
Inventory.PickupSound "WeaponBuild"
action native A_MStaffAttack(); action native A_MStaffAttack();
action native A_MStaffPalette(); action native A_MStaffPalette();

View file

@ -186,6 +186,7 @@ class Actor extends Thinker
action native A_DropFire(); action native A_DropFire();
action native A_GiveQuestItem(eval int itemno); action native A_GiveQuestItem(eval int itemno);
action native A_RemoveForcefield(); action native A_RemoveForcefield();
action native A_DropWeaponPieces(class<Actor> p1, class<Actor> p2, class<Actor> p3);
} }
class Inventory extends Actor class Inventory extends Actor

View file

@ -0,0 +1,814 @@
ACTOR StrifeWeapon : DoomWeapon
{
}
// Same as the bullet puff for Doom -----------------------------------------
ACTOR StrifePuff
{
+NOBLOCKMAP
+NOGRAVITY
+ALLOWPARTICLES
RenderStyle Translucent
Alpha 0.25
states
{
Spawn:
POW3 ABCDEFGH 3
Stop
Crash:
PUFY A 4 Bright
PUFY BCD 4
Stop
}
}
// A spark when you hit something that doesn't bleed ------------------------
// Only used by the dagger.
ACTOR StrifeSpark : StrifePuff
{
RenderStyle Add
States
{
Crash:
POW2 ABCD 4
Stop
}
}
// Punch Dagger -------------------------------------------------------------
ACTOR PunchDagger : StrifeWeapon
{
Weapon.SelectionOrder 3900
+WEAPON.NOALERT
action native A_JabDagger ();
States
{
Ready:
PNCH A 1 A_WeaponReady
Loop
Deselect:
PNCH A 1 A_Lower
Loop
Select:
PNCH A 1 A_Raise
Loop
Fire:
PNCH B 4
PNCH C 4 A_JabDagger
PNCH D 5
PNCH C 4
PNCH B 5 A_ReFire
Goto Ready
}
}
// The base for Strife projectiles that die with ZAP1 -----------------------
ACTOR StrifeZap1
{
+NOBLOCKMAP
+NOGRAVITY
+DROPOFF
States
{
Spawn:
Death:
ZAP1 A 3 A_AlertMonsters
ZAP1 BCDEFE 3
ZAP1 DCB 2
ZAP1 A 1
Stop
}
}
// Electric Bolt ------------------------------------------------------------
ACTOR ElectricBolt : StrifeZap1
{
ConversationID 102,-1,-1
Speed 30
Radius 10
Height 10
Damage 10
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
SeeSound "misc/swish"
ActiveSound "misc/swish"
DeathSound "weapons/xbowhit"
States
{
Spawn:
AROW A 10 A_LoopActiveSound
Loop
}
}
// Poison Bolt --------------------------------------------------------------
ACTOR PoisonBolt native
{
ConversationID 102,-1,-1
Speed 30
Radius 10
Height 10
Damage 500
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
SeeSound "misc/swish"
ActiveSound "misc/swish"
States
{
Spawn:
ARWP A 10 A_LoopActiveSound
Loop
Death:
AROW A 1
Stop
}
}
// Strife's Crossbow --------------------------------------------------------
ACTOR StrifeCrossbow : StrifeWeapon 2001
{
Game Strife
+FLOORCLIP
ConversationID 194, 188, 192
Weapon.SelectionOrder 1200
+WEAPON.NOALERT
Weapon.AmmoUse1 1
Weapon.AmmoGive1 8
Weapon.AmmoType1 "ElectricBolts"
Weapon.SisterWeapon "StrifeCrossbow2"
Inventory.PickupMessage "$TXT_STRIFECROSSBOW"
Inventory.Icon "CBOWA0"
Tag "crossbow"
action native A_ClearFlash ();
action native A_ShowElectricFlash ();
action native A_FireArrow (class<Actor> proj);
states
{
Spawn:
CBOW A -1
Stop
Ready:
XBOW A 0 A_ShowElectricFlash
XBOW A 1 A_WeaponReady
Wait
Deselect:
XBOW A 1 A_Lower
Loop
Select:
XBOW A 1 A_Raise
Loop
Fire:
XBOW A 3 A_ClearFlash
XBOW B 6 A_FireArrow("ElectricBolt")
XBOW C 4
XBOW D 6
XBOW E 3
XBOW F 5
XBOW G 0 A_ShowElectricFlash
XBOW G 5 A_CheckReload
Goto Ready
Flash:
XBOW KLM 5
Loop
}
}
ACTOR StrifeCrossbow2 : StrifeCrossbow
{
Weapon.SelectionOrder 2700
Weapon.AmmoUse1 1
Weapon.AmmoGive1 0
Weapon.AmmoType1 "PoisonBolts"
Weapon.SisterWeapon "StrifeCrossbow"
States
{
Ready:
XBOW H 1 A_WeaponReady
Loop
Deselect:
XBOW H 1 A_Lower
Loop
Select:
XBOW H 1 A_Raise
Loop
Fire:
XBOW H 3
XBOW B 6 A_FireArrow("PoisonBolt")
XBOW C 4
XBOW D 6
XBOW E 3
XBOW I 5
XBOW J 5 A_CheckReload
Goto Ready
Flash:
Stop
}
}
// Assault Gun --------------------------------------------------------------
actor AssaultGun : StrifeWeapon 2002
{
Game Strife
ConversationID 188, 182, 186
+FLOORCLIP
Weapon.SelectionOrder 600
Weapon.AmmoUse1 1
Weapon.AmmoGive1 20
Weapon.AmmoType1 "ClipOfBullets"
Inventory.Icon "RIFLA0"
Tag "assault_gun"
Inventory.PickupMessage "$TXT_ASSAULTGUN"
States
{
Spawn:
RIFL A -1
Stop
Ready:
RIFG A 1 A_WeaponReady
Loop
Deselect:
RIFG B 1 A_Lower
Loop
Select:
RIFG A 1 A_Raise
Loop
Fire:
RIFF AB 3 A_FireAssaultGun
RIFG D 3 A_FireAssaultGun
RIFG C 0 A_ReFire
RIFG B 2 A_Light0
Goto Ready
}
}
// Standing variant of the assault gun --------------------------------------
ACTOR AssaultGunStanding : WeaponGiver 2006
{
Game Strife
ConversationID 189, 183, 187
DropItem "AssaultGun"
Inventory.PickupMessage "$TXT_ASSAULTGUN"
States
{
Spawn:
RIFL B -1
Stop
}
}
// Mini-Missile Launcher ----------------------------------------------------
ACTOR MiniMissileLauncher : StrifeWeapon 2003
{
Game Strife
ConversationID 192, 186, 190
+FLOORCLIP
Weapon.SelectionOrder 1800
Weapon.AmmoUse1 1
Weapon.AmmoGive1 8
Weapon.AmmoType1 "MiniMissiles"
Inventory.Icon "MMSLA0"
Tag "mini_missile_launcher"
Inventory.PickupMessage "$TXT_MMLAUNCHER"
action native A_FireMiniMissile ();
States
{
Spawn:
MMSL A -1
Stop
Ready:
MMIS A 1 A_WeaponReady
Loop
Deselect:
MMIS A 1 A_Lower
Loop
Select:
MMIS A 1 A_Raise
Loop
Fire:
MMIS A 4 A_FireMiniMissile
MMIS B 4 A_Light1
MMIS C 5 Bright
MMIS D 2 Bright A_Light2
MMIS E 2 Bright
MMIS F 2 Bright A_Light0
MMIS F 0 A_ReFire
Goto Ready
}
}
// Rocket Trail -------------------------------------------------------------
ACTOR RocketTrail
{
ConversationID 51,-1,-1
+NOBLOCKMAP
+NOGRAVITY
RenderStyle Translucent
Alpha 0.25
SeeSound "misc/missileinflight"
States
{
Spawn:
PUFY BCBCD 4
Stop
}
}
// Rocket Puff --------------------------------------------------------------
ACTOR MiniMissilePuff
{
-ALLOWPARTICLES
States
{
Spawn:
Goto Crash
}
}
// Mini Missile -------------------------------------------------------------
ACTOR MiniMissile
{
ConversationID 99,-1,-1
Speed 20
Radius 10
Height 14
Damage 10
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
SeeSound "weapons/minimissile"
DeathSound "weapons/minimissilehit"
States
{
Spawn:
MICR A 6 Bright A_RocketInFlight
Loop
Death:
SMIS A 0 Bright A_SetTranslucent(1,1)
SMIS A 0 Bright A_StopSoundEx("Voice")
SMIS A 5 Bright A_Explode(64,64,1,1)
SMIS B 5 Bright
SMIS C 4 Bright
SMIS DEFG 2 Bright
Stop
}
}
// Flame Thrower ------------------------------------------------------------
ACTOR FlameThrower : StrifeWeapon 2005
{
Game Strife
ConversationID 190, 184, 188
+FLOORCLIP
Weapon.SelectionOrder 2100
Weapon.Kickback 0
Weapon.AmmoUse1 1
Weapon.AmmoGive1 100
Weapon.UpSound "weapons/flameidle"
Weapon.ReadySound "weapons/flameidle"
Weapon.AmmoType1 "EnergyPod"
Inventory.Icon "FLAMA0"
Tag "flame_thrower"
Inventory.PickupMessage "$TXT_FLAMER"
action native A_FireFlamer ();
States
{
Spawn:
FLAM A -1
Stop
Ready:
FLMT AB 3 A_WeaponReady
Loop
Deselect:
FLMT A 1 A_Lower
Loop
Select:
FLMT A 1 A_Raise
Loop
Fire:
FLMF A 2 A_FireFlamer
FLMF B 3 A_ReFire
Goto Ready
}
}
// Flame Thrower Projectile -------------------------------------------------
ACTOR FlameMissile
{
Speed 15
Height 11
Radius 8
Mass 10
Damage 4
DamageType Fire
ReactionTime 8
Projectile
-NOGRAVITY
+STRIFEDAMAGE
MaxStepHeight 4
RenderStyle Add
SeeSound "weapons/flamethrower"
action native A_FlameDie ();
States
{
Spawn:
FRBL AB 3 Bright
FRBL C 3 Bright A_Countdown
Loop
Death:
FRBL D 5 Bright A_FlameDie
FRBL EFGHI 5 Bright
Stop
}
}
// Mauler -------------------------------------------------------------------
// The scatter version
ACTOR Mauler : StrifeWeapon 2004
{
Game Strife
ConversationID 193, 187, 191
+FLOORCLIP
Weapon.SelectionOrder 300
Weapon.AmmoUse1 20
Weapon.AmmoGive1 40
Weapon.AmmoType1 "EnergyPod"
Weapon.SisterWeapon "Mauler2"
Inventory.Icon "TRPDA0"
Tag "mauler"
Inventory.PickupMessage "$TXT_MAULER"
action native A_FireMauler1 ();
States
{
Ready:
MAUL FGHA 6 A_WeaponReady
Loop
Deselect:
MAUL A 1 A_Lower
Loop
Select:
MAUL A 1 A_Raise
Loop
Fire:
BLSF A 5 Bright A_FireMauler1
MAUL B 3 Bright A_Light1
MAUL C 2 A_Light2
MAUL DE 2
MAUL A 7 A_Light0
MAUL H 7
MAUL G 7 A_CheckReload
Goto Ready
Spawn:
TRPD A -1
Stop
}
}
// Mauler Torpedo version ---------------------------------------------------
ACTOR Mauler2 : Mauler
{
Weapon.SelectionOrder 3300
Weapon.AmmoUse1 30
Weapon.AmmoGive1 0
Weapon.AmmoType1 "EnergyPod"
Weapon.SisterWeapon "Mauler"
action native A_FireMauler2Pre ();
action native A_FireMauler2 ();
States
{
Ready:
MAUL IJKL 7 A_WeaponReady
Loop
Deselect:
MAUL I 1 A_Lower
Loop
Select:
MAUL I 1 A_Raise
Loop
Fire:
MAUL I 20 A_FireMauler2Pre
MAUL J 10 A_Light1
BLSF A 10 Bright A_FireMauler2
MAUL B 3 Bright A_Light2
MAUL C 2
MAUL D 2 A_Light0
MAUL E 2 A_ReFire
Goto Ready
}
}
// Mauler "Bullet" Puff -----------------------------------------------------
ACTOR MaulerPuff
{
+NOBLOCKMAP
+NOGRAVITY
+PUFFONACTORS
RenderStyle Add
DamageType Disintegrate
states
{
Spawn:
MPUF AB 5
POW1 ABCDE 4
Stop
}
}
// The Mauler's Torpedo -----------------------------------------------------
ACTOR MaulerTorpedo
{
Speed 20
Height 8
Radius 13
Damage 1
DamageType Disintegrate
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
RenderStyle Add
SeeSound "weapons/mauler2fire"
DeathSound "weapons/mauler2hit"
action native A_MaulerTorpedoWave ();
States
{
Spawn:
TORP ABCD 4 Bright
Loop
Death:
THIT AB 8 Bright
THIT C 8 Bright A_MaulerTorpedoWave
THIT DE 8 Bright
Stop
}
}
// The mini torpedoes shot by the big torpedo --------------------------------
ACTOR MaulerTorpedoWave
{
Speed 35
Radius 13
Height 13
Damage 10
DamageType Disintegrate
Projectile
+STRIFEDAMAGE
MaxStepHeight 4
RenderStyle Add
States
{
Spawn:
TWAV ABC 9 Bright
Stop
}
}
// High-Explosive Grenade ---------------------------------------------------
ACTOR HEGrenade
{
ConversationID 106,-1,-1
Speed 15
Radius 13
Height 13
Mass 20
Damage 1
Reactiontime 30
Projectile
-NOGRAVITY
+STRIFEDAMAGE
+NOBOUNCESOUND
+BOUNCEONACTORS
+EXPLODEONWATER
+DOOMBOUNCE
MaxStepHeight 4
BounceFactor 0.5
BounceCount 2
SeeSound "weapons/hegrenadeshoot"
DeathSound "weapons/hegrenadebang"
States
{
Spawn:
GRAP AB 3 A_Countdown
Loop
Death:
BNG4 A 0 Bright A_NoGravity
BNG4 A 0 Bright A_SetTranslucent(1,1)
BNG4 A 2 Bright A_Explode(192,192,1,1)
BNG4 BCDEFGHIJKLMN 3 Bright
Stop
}
}
// White Phosphorous Grenade ------------------------------------------------
ACTOR PhosphorousGrenade
{
ConversationID 107,-1,-1
Speed 15
Radius 13
Height 13
Mass 20
Damage 1
Reactiontime 40
Projectile
-NOGRAVITY
+STRIFEDAMAGE
+NOBOUNCESOUND
+BOUNCEONACTORS
+EXPLODEONWATER
+DOOMBOUNCE
MaxStepHeight 4
BounceFactor 0.5
BounceCount 2
SeeSound "weapons/phgrenadeshoot"
DeathSound "weapons/phgrenadebang"
States
{
Spawn:
GRIN AB 3 A_Countdown
Loop
Death:
BNG3 A 1 A_SpawnItemEx("PhosphorousFire")
Stop
}
}
// Fire from the Phoshorous Grenade -----------------------------------------
ACTOR PhosphorousFire native
{
Reactiontime 120
DamageType Fire
+NOBLOCKMAP
+FLOORCLIP
+NOTELEPORT
+NODAMAGETHRUST
RenderStyle Add
action native A_Burnarea ();
action native A_Burnination ();
states
{
Spawn:
BNG3 B 2 Bright A_Burnarea
BNG3 C 2 Bright A_Countdown
FLBE A 2 Bright A_Burnination
FLBE B 2 Bright A_Countdown
FLBE C 2 Bright A_Burnarea
FLBE D 3 Bright A_Countdown
FLBE E 3 Bright A_Burnarea
FLBE F 3 Bright A_Countdown
FLBE G 3 Bright A_Burnination
Goto Spawn+5
Death:
FLBE H 2 Bright
FLBE I 2 Bright A_Burnination
FLBE JK 2 Bright
Stop
}
}
// High-Explosive Grenade Launcher ------------------------------------------
ACTOR StrifeGrenadeLauncher : StrifeWeapon 154
{
Game Strife
ConversationID 195, 189, 193
+FLOORCLIP
Weapon.SelectionOrder 2400
Weapon.AmmoUse1 1
Weapon.AmmoGive1 12
Weapon.AmmoType1 "HEGrenadeRounds"
Weapon.SisterWeapon "StrifeGrenadeLauncher2"
Inventory.Icon "GRNDA0"
Tag "Grenade_launcher"
Inventory.PickupMessage "$TXT_GLAUNCHER"
action native A_FireGrenade (class<Actor> grenadetype, eval int angleofs, state flash);
States
{
Spawn:
GRND A -1
Stop
Ready:
GREN A 1 A_WeaponReady
Loop
Deselect:
GREN A 1 A_Lower
Loop
Select:
GREN A 1 A_Raise
Loop
Fire:
GREN A 5 A_FireGrenade("HEGrenade", -90, "Flash")
GREN B 10
GREN A 5 A_FireGrenade("HEGrenade", 90, "Flash2")
GREN C 10
GREN A 0 A_ReFire
Goto Ready
Flash:
GREF A 5 Bright A_Light1
Goto LightDone
Flash2:
GREF B 5 Bright A_Light2
Goto LightDone
}
}
// White Phosphorous Grenade Launcher ---------------------------------------
ACTOR StrifeGrenadeLauncher2 : StrifeGrenadeLauncher
{
Weapon.SelectionOrder 3200
Weapon.AmmoUse1 1
Weapon.AmmoGive1 0
Weapon.AmmoType1 "PhosphorusGrenadeRounds"
Weapon.SisterWeapon "StrifeGrenadeLauncher"
States
{
Ready:
GREN D 1 A_WeaponReady
Loop
Deselect:
GREN D 1 A_Lower
Loop
Select:
GREN D 1 A_Raise
Loop
Fire:
GREN D 5 A_FireGrenade("PhosphorousGrenade", -90, "Flash")
GREN E 10
GREN D 5 A_FireGrenade("PhosphorousGrenade", 90, "Flash2")
GREN F 10
GREN A 0 A_ReFire
Goto Ready
Flash:
GREF C 5 Bright A_Light1
Goto LightDone
Flash2:
GREF D 5 Bright A_Light2
Goto LightDone
}
}

View file

@ -108,6 +108,7 @@
#include "actors/strife/strifehumanoid.txt" #include "actors/strife/strifehumanoid.txt"
#include "actors/strife/strifeplayer.txt" #include "actors/strife/strifeplayer.txt"
#include "actors/strife/strifeweapons.txt"
#include "actors/strife/spectral.txt" #include "actors/strife/spectral.txt"
#include "actors/strife/acolyte.txt" #include "actors/strife/acolyte.txt"
#include "actors/strife/alienspectres.txt" #include "actors/strife/alienspectres.txt"

View file

@ -2408,10 +2408,6 @@
RelativePath=".\src\g_hexen\a_teleportother.cpp" RelativePath=".\src\g_hexen\a_teleportother.cpp"
> >
</File> </File>
<File
RelativePath="src\g_hexen\a_weaponpieces.cpp"
>
</File>
<File <File
RelativePath=".\src\g_hexen\a_wraith.cpp" RelativePath=".\src\g_hexen\a_wraith.cpp"
> >