May 6, 2006 (Changes by Graf Zahl)

- Converted a_zombie.cpp and most of a_strifestuff.cpp to DECORATE.
- Converted a_strifekeys.cpp to DECORATE and moved the pickup messages to the
  string table.
- Removed the WIF_HITS_GHOSTS weapon flag and replaced it with MF2_THRUGHOST. 
  There is no need to keep two flags around with virtually the same meaning.
- Changed the ShadowArmor to use the VISIBILITYPULSE flag to change its translucency.
  It looks much better now than the cheap code pointer based blinking it used before.
- Converted most of a_strifeitems.cpp to DECORATE and moved the pickup messages 
  to the string table.
- Converted a_strifearmor.cpp to DECORATE and moved the pickup messages to the
  string table.
- Moved the messages for killing spectres to the string table.
- Converted the quest items to DECORATE. Also changed A_GiveQuestItem to get
  the messages it prints from the string table instead of the quest item's tag
  string.

May 5, 2006 (Changes by Graf Zahl)
- Removed the hopelessly outdated thingdef_doc.txt file from the repository.
- Converted a_peasant.cpp and a_ratbuddy.cpp to DECORATE.
- Fixed: C_DoKey didn't treat an empty string as 'no binding' when checking for
  valid double bindings.
- Converted a_merchants.cpp to DECORATE.
- Added MF5_NODAMAGE flag to generalize the behavior of Strife's merchants which
  can be shot but take no damage from getting hurt.
- Converted a_beggars.cpp to DECORATE.
- Added an Inventory.GiveQuest property. This makes it possible to define all of
  Strife's original items that also give a quest item in DECORATE but it is also 
  useful to define items like the ones in Day of the Acolyte without ugly workarounds.
- Added a Tag property and Strife teaser conversation IDs to DECORATE so now it is 
  possible to define many of Strife's items.
- Added a FastSpeed property to DECORATE so that projectiles can finally be
  assigned a higher speed for fast mode.
- Added a ACS_LockedExecuteDoor special. It is basically the same as the existing
  ACS_LockedExecute but it uses the 'door' message instead of 'remote'. This
  cannot be integrated into ACS_LockedExecute because all its arguments are already
  in use.
- Added a fully customizable A_CustomMeleeAttack function for DECORATE.


SVN r83 (trunk)
This commit is contained in:
Christoph Oelckers 2006-05-07 00:27:22 +00:00
parent abed04ab23
commit 605a9a7715
51 changed files with 3909 additions and 5844 deletions

View file

@ -176,17 +176,17 @@ ${COMPILER} "autostart.cpp a.nas blocks.nas misc.nas tmap.nas tmap2.nas tmap3.na
a_heresiarch.cpp \ a_heresiarch.cpp \
a_hexenspecialdecs.cpp a_iceguy.cpp a_korax.cpp a_mageboss.cpp a_magecone.cpp \ a_hexenspecialdecs.cpp a_iceguy.cpp a_korax.cpp a_mageboss.cpp a_magecone.cpp \
a_magelightning.cpp a_mageplayer.cpp a_magestaff.cpp a_magewand.cpp a_mana.cpp \ a_magelightning.cpp a_mageplayer.cpp a_magestaff.cpp a_magewand.cpp a_mana.cpp \
a_pig.cpp a_puzzleitems.cpp a_scriptprojectiles.cpp a_serpent.cpp \ a_pig.cpp a_puzzleitems.cpp a_serpent.cpp \
a_spike.cpp a_summon.cpp a_teleportother.cpp a_weaponpieces.cpp a_wraith.cpp \ a_spike.cpp a_summon.cpp a_teleportother.cpp a_weaponpieces.cpp a_wraith.cpp \
hexen_sbar.cpp a_artiegg.cpp a_artitele.cpp a_minotaur.cpp a_ravenambient.cpp \ hexen_sbar.cpp a_artiegg.cpp a_artitele.cpp a_minotaur.cpp a_ravenambient.cpp \
a_acolyte.cpp a_alienspectres.cpp \ a_acolyte.cpp a_alienspectres.cpp \
a_beggars.cpp a_coin.cpp a_crusader.cpp a_entityboss.cpp a_inquisitor.cpp \ a_coin.cpp a_crusader.cpp a_entityboss.cpp a_inquisitor.cpp \
a_loremaster.cpp a_macil.cpp a_merchants.cpp a_oracle.cpp a_peasant.cpp \ a_loremaster.cpp a_macil.cpp a_oracle.cpp \
a_programmer.cpp a_questitems.cpp a_ratbuddy.cpp a_reaver.cpp a_rebels.cpp \ a_programmer.cpp a_reaver.cpp a_rebels.cpp \
a_sentinel.cpp a_spectral.cpp a_stalker.cpp a_strifeammo.cpp a_strifearmor.cpp \ a_sentinel.cpp a_spectral.cpp a_stalker.cpp a_strifeammo.cpp \
a_strifebishop.cpp a_strifeitems.cpp a_strifekeys.cpp a_strifeplayer.cpp \ a_strifebishop.cpp a_strifeitems.cpp a_strifeplayer.cpp \
a_strifestuff.cpp a_strifeweapons.cpp a_templar.cpp a_thingstoblowup.cpp \ a_strifestuff.cpp a_strifeweapons.cpp a_templar.cpp a_thingstoblowup.cpp \
a_zombie.cpp strife_sbar.cpp a_action.cpp a_artifacts.cpp a_bridge.cpp \ strife_sbar.cpp a_action.cpp a_artifacts.cpp a_bridge.cpp \
a_camera.cpp a_debris.cpp a_decals.cpp a_flashfader.cpp a_fountain.cpp \ a_camera.cpp a_debris.cpp a_decals.cpp a_flashfader.cpp a_fountain.cpp \
a_hatetarget.cpp a_keys.cpp a_lightning.cpp a_movingcamera.cpp a_pickups.cpp \ a_hatetarget.cpp a_keys.cpp a_lightning.cpp a_movingcamera.cpp a_pickups.cpp \
a_quake.cpp a_secrettrigger.cpp a_sectoraction.cpp a_sharedmisc.cpp a_skies.cpp \ a_quake.cpp a_secrettrigger.cpp a_sectoraction.cpp a_sharedmisc.cpp a_skies.cpp \

View file

@ -18,6 +18,45 @@ May 6, 2006
This could also have been used to fix FName, but I consider the current This could also have been used to fix FName, but I consider the current
implementation to be better than the old one, so I'm leaving it as-is. implementation to be better than the old one, so I'm leaving it as-is.
May 6, 2006 (Changes by Graf Zahl)
- Converted a_zombie.cpp and most of a_strifestuff.cpp to DECORATE.
- Converted a_strifekeys.cpp to DECORATE and moved the pickup messages to the
string table.
- Removed the WIF_HITS_GHOSTS weapon flag and replaced it with MF2_THRUGHOST.
There is no need to keep two flags around with virtually the same meaning.
- Changed the ShadowArmor to use the VISIBILITYPULSE flag to change its translucency.
It looks much better now than the cheap code pointer based blinking it used before.
- Converted most of a_strifeitems.cpp to DECORATE and moved the pickup messages
to the string table.
- Converted a_strifearmor.cpp to DECORATE and moved the pickup messages to the
string table.
- Moved the messages for killing spectres to the string table.
- Converted the quest items to DECORATE. Also changed A_GiveQuestItem to get
the messages it prints from the string table instead of the quest item's tag
string.
May 5, 2006 (Changes by Graf Zahl)
- Removed the hopelessly outdated thingdef_doc.txt file from the repository.
- Converted a_peasant.cpp and a_ratbuddy.cpp to DECORATE.
- Fixed: C_DoKey didn't treat an empty string as 'no binding' when checking for
valid double bindings.
- Converted a_merchants.cpp to DECORATE.
- Added MF5_NODAMAGE flag to generalize the behavior of Strife's merchants which
can be shot but take no damage from getting hurt.
- Converted a_beggars.cpp to DECORATE.
- Added an Inventory.GiveQuest property. This makes it possible to define all of
Strife's original items that also give a quest item in DECORATE but it is also
useful to define items like the ones in Day of the Acolyte without ugly workarounds.
- Added a Tag property and Strife teaser conversation IDs to DECORATE so now it is
possible to define many of Strife's items.
- Added a FastSpeed property to DECORATE so that projectiles can finally be
assigned a higher speed for fast mode.
- Added a ACS_LockedExecuteDoor special. It is basically the same as the existing
ACS_LockedExecute but it uses the 'door' message instead of 'remote'. This
cannot be integrated into ACS_LockedExecute because all its arguments are already
in use.
- Added a fully customizable A_CustomMeleeAttack function for DECORATE.
May 5, 2006 May 5, 2006
- Fixed: Scanned IWAD paths were not freed if you exited without selecting one. - Fixed: Scanned IWAD paths were not freed if you exited without selecting one.
- Fixed: Dynamically allocated cvars were not freed on exit. - Fixed: Dynamically allocated cvars were not freed on exit.
@ -40,6 +79,8 @@ May 4, 2006
were missing game filters. were missing game filters.
May 4, 2006 (Changes by Graf Zahl) May 4, 2006 (Changes by Graf Zahl)
- Added Poisondamage property for DECORATE. I first did this for one of the first
DECORATE updates but the code seems to have gotten lost.
- Converted A_Puzzleitems.cpp and parts of A_HexenSpecialdecs.cpp to DECORATE. - Converted A_Puzzleitems.cpp and parts of A_HexenSpecialdecs.cpp to DECORATE.
- Converted A_Hexendecorations.cpp to DECORATE. - Converted A_Hexendecorations.cpp to DECORATE.
- Changed the lower decal spawning code to transfer the main decal's color if - Changed the lower decal spawning code to transfer the main decal's color if
@ -439,7 +480,7 @@ April 13, 2006 (Changes by Graf Zahl)
- Added checks for sectors without lines to all Find* functions in p_sector.cpp - Added checks for sectors without lines to all Find* functions in p_sector.cpp
- Fixed: Dehacked patches weren't loaded when not playing Doom. - Fixed: Dehacked patches weren't loaded when not playing Doom.
- Fixed: Thing_Remove must not remove living players from the map. - Fixed: Thing_Remove must not remove living players from the map.
- Fixed: Using $MAP in SNDINFO overrides music definitions in MAPINFO. This - Fixed: Using $MAP in SNDINFO overrode music definitions in MAPINFO. This
made it impossible to define music in MAPINFO for Hexen. made it impossible to define music in MAPINFO for Hexen.
- Fixed: Resurrecting a morphed player must first restore the unmorphed - Fixed: Resurrecting a morphed player must first restore the unmorphed
version. version.
@ -534,7 +575,7 @@ April 11, 2006 (Changes by Graf Zahl)
- Fixed: Strife's dialogs don't give weapons to the player he already has. - Fixed: Strife's dialogs don't give weapons to the player he already has.
- Fixed: The INDIANA cheat in Hexen gives 25 of each item, not just 1. - Fixed: The INDIANA cheat in Hexen gives 25 of each item, not just 1.
- Fixed: The stair builder's compatibility mode must do a linear search - Fixed: The stair builder's compatibility mode must do a linear search
for sectors. Searching the hasch chain doesn't work here. for sectors. Searching the hash chain doesn't work here.
- Fixed: Any monster with a TakeSpecialDamage method should call the - Fixed: Any monster with a TakeSpecialDamage method should call the
super class's method instead of simply returning the damage amount. super class's method instead of simply returning the damage amount.
- Fixed: Hexen's mash monsters cannot be frozen. No matter how you kill - Fixed: Hexen's mash monsters cannot be frozen. No matter how you kill

View file

@ -1,597 +0,0 @@
Examples for actor definitions
------------------------------
1) a complete definition from scratch:
ACTOR ZombieMan 3004
{
Health 20
Radius 20
Height 56
Speed 8
PainChance 200
MONSTER
+FLOORCLIP
SeeSound grunt/sight
AttackSound grunt/attack
PainSound grunt/pain
DeathSound grunt/death
ActiveSound grunt/active
Obituary "%o was killed by a zombieman."
DropItem Clip
Damage 4
States
{
Spawn:
POSS AB 10 A_Look
Loop
See:
POSS AABBCCDD 4 A_Chase
Loop
Missile:
POSS E 10 A_FaceTarget
POSS F 8 A_BulletAttack
POSS E 8
Goto See
Pain:
POSS G 3
POSS G 3 A_Pain
Goto See
Death:
POSS H 5
POSS I 5 A_Scream
POSS J 5 A_Fall
POSS K 5
POSS L -1
Stop
XDeath:
POSS M 5
POSS N 5 A_XScream
POSS O 5 A_Fall
POSS PQRST 5
POSS U -1
Stop
Raise:
POSS KJIH 5
Goto See
}
}
2) an actor which inherits from an existing one:
ACTOR PlasmaZombie : ZombieMan 9600
{
Health 40
DropItem Cell
MissileType PlasmaBall
States
{
Missile:
POSS E 10 A_FaceTarget
POSS F 5 A_MissileAttack
POSS E 5 A_FaceTarget
POSS F 5 A_MissileAttack
POSS E 5 A_FaceTarget
POSS F 5 A_MissileAttack
Goto See
}
}
(this is a zombie which fires 3 plasma bullets when attacking)
3) an actor which uses SKIP_SUPER
ACTOR DeadZombieMan : ZombieMan 18
{
SKIP_SUPER
Spawn Parent Death+4
}
(this actor doesn't inherit anything from its parent - it just uses
some of its states.)
Syntax:
-------
ACTOR classname [ : parentclassname] [doomednum]
{
properties
flags
...
}
classname: The name this new actor is referenced by in the game
parentclassname: (optional) The name of a parent class this new actor
inherits its attributes from.
doomednum: Editor number for this actor (optional)
List of properties:
===================
SKIP_SUPER reinitializes the actor as if it has no parent
This can be used to have access to the parent's
states without inheriting its attributes. See
3) above for an example.
SPAWNID value defines the spawn ID to be used with Thing_Spawn
and its derivates.
HEALTH value defines the health a monster starts with
Default is 1000
REACTIONTIME value Time in tics (1/35 seconds) a monster needs
to attack back. There is normally no need to
change this value.
Default is 8
PAINCHANCE value Probability of entering the pain state.
255=always, 0=never
Default is 0
DAMAGE value For a projectile defines the damage it inflicts
upon impact. The formula is random(1,8)*damage
or (random(1,4)*damage if STRIFEDAMAGE is set.
This also defines the damage for actors which
attack like the Lost Soul. The formula for this
is random(1,8)*damage.
DAMAGE is also used to define how many bullets
are fired by the generic hitscan attack function
A_Bulletattack.
Default is 0
SPEED value Defines how fast an actor moves. For projectiles
this is the distance it moves. For monsters it
defines the size of one step done in A_Chase.
Default is 0.
RADIUS value Defines the radius of this actor.
Default is 20.
HEIGHT value Defines the height of this actor
Default is 16.
MASS value Defines the mass of this actor.
The larger the mass the less an actor moves when
being thrust by damage.
Default is 100.
XSCALE value Defines the X-scaling for this actor.
Range is [0.0, 4.0].
Default is 1.0
YSCALE value Defines the Y-scaling for this actor.
Range is [0.0, 4.0].
Default is 1.0
SCALE value Combines XScale and YScale
Range is [0.0, 4.0].
Default is 1.0
SEESOUND name Defines the sound the actor makes when it sees
the player (for monsters) or when a projectile
is spawned.
ATTACKSOUND name Defines the sound the actor makes when attacking.
PAINSOUND name Defines the sound the actor makes when in pain.
To hear this sound A_Pain has to be called.
DEATHSOUND name Defines the sound the actor makes when dying
or when a projectile explodes.
ACTIVESOUND name Defines the sound the actor makes when active.
MELEESOUND name Defines the sound the actor makes when doing
a melee attack in A_MeleeAttack. Note that
several original attack functions which have
such a sound use a hard coded reference (e.g.
A_TroopAttack uses imp/melee)
RENDERSTYLE type Defines how this actor is rendered. Useful values are:
NONE - actor is invisible
NORMAL - actor is visible and not translucent
FUZZY - like the Spectre in Doom
TRANSLUCENT - actor is translucent.
ADD - actor uses additive translucency.
Default is NORMAL
ALPHA value defines the opacity/intensity for render styles
TRANSLUCENT and ADD.
Range is [0.0, 1.0]
Default is 1.0
DEATHHEIGHT value Defines the height this actor has after dying.
Default is 1/4 of the original height
BURNHEIGHT value Defines the height this actor has after dying by fire.
Default is 1/4 of the original height
*OBITUARY string Defines the obituary string for this actor. This string
uses a few placeholders:
%o: victim's name
%k: killer's name
%g: he/she/it
%h: him/her/it
%p: his/her/its
*HITOBITUARY string Defines the obituary string for a melee attack by this
actor. If not present OBITUARY is used. The same format
as for OBITUARY appplies.
*DONTHURTSHOOTER If this actor deals explosive damage and is a projectile
it does not hurt the shooter.
*EXPLOSIONRADIUS value Defines the radius of explosive damage
Default is 128
*EXPLOSIONDAMAGE value Defines the amount of explosive damage
Default is 128
MELEEDAMAGE value Defines the amount of damage this monste will inflict
when using A_MeleeAttack. The formula is random(1,8)*damage.
MISSILETYPE name Defines the projectile type this monster is firing when
using A_MissileAttack. Any valid projectile present in the
game can be specified.
MISSILEHEIGHT value Defines the height at which the projectile is spawned.
Default is 32.
MONSTER Sets all appropriate flags to make this actor act as a regular
monster. The following flags are being set:
SHOOTABLE, COUNTKILL, SOLID, CANPUSHWALLS, ACTIVATEMCROSS, CANPASS, ISMONSTER.
PROJECTILE Sets all appropriate flags to make this actor act as a regular
projectile. The following flags are being set:
NOBLOCKMAP, NOGRAVITY, DROPOFF, MISSILE, ACTIVATEIMPACT, ACTIVATEPCROSS, NOTELEPORT.
CLEARFLAGS clears all flags
*DROPITEM name [probability [amount]]
Drops an item of type 'name' when dying. Optionally the probability
can be specified. A probability of 255 means the item is always dropped,
a probability of 0 means it is never dropped.
amount is only applicable for Heretic ammuniton. It specifies how much
ammo the dropped item contains.
There can be more than one DROPITEM definitions for an actor. The
amount is unlimited.
DROPITEM works differently with inherited actors. An actor can inherit
a list of DROPITEM definitions from its parent but if it defines one
of its own the entire parent's list is discarded.
SPAWN
SEE
MELEE
MISSILE
PAIN
DEATH
XDEATH
BURN
ICE
RAISE
CRASH With these keywords a specific state in the actor can be either cleared
or set to one of the parent's states. The syntax is:
SPAWN 0 to clear a state or
SPAWN PARENT DEATH[+offset] to set a parent's state. See 3) above for an
example
STATES Defines an actor's states. See the separate block STATES for more information
Properties prefixed with a '*' cannot be inherited from predefined actors due to the
implementation.
List of flags
=============
Flags are special properties that can be either set or cleared
+flagname sets a flag
-flagname clears a flag
The following flags exist. If applicable the name is identical with the one used
in regular DECORATE items.
SOLID set when the object should be solid (blocking)
SHOOTABLE object can be damaged. If health goes below 0 it dies
NOSECTOR Object is not linked into the sector. This makes it invisible
and excludes it from certain physics checks.
NOBLOCKMAP This object is excluded from passive collision detection. Nothing else
can run into a NOBLOCKMAP object but the object itself can run
into others. All projectiles have this set.
AMBUSH Monster is 'deaf'. Normally this is set in an editor on a per-
object basis.
JUSTHIT try to attack right back (used in monster AI, probably not
particularly useful in actor definitions)
JUSTATTACKED take at least one step before attacking
SPAWNCEILING spawned hanging from the ceiling as opposed to standing on the
floor.
NOGRAVITY Actor is not subject to gravity
DROPOFF Monster can walk over ledges/taller steps.
NOCLIP Actor is totally excluded from collision detection and
can walk through walls etc.
FLOAT Floating monster - can change height at will.
TELEPORT Although implemented there isn't a single actor which
uses this flag. I can't say what it does precisely but
it excludes an actor that has it set from certain parts
of the collision detection logic.
MISSILE Actor is a projectile.
SHADOW Actor is nearly invisible. Unlike regular Doom this does
not automatically imply fuzziness. For that you have to
specify RenderStyle Fuzzy.
NOBLOOD Actor does not bleed when hurt.
CORPSE Actor is a corpse. For normal actors there is no need to
set this but in combination with the crashstate it might
be useful.
COUNTKILL Counts toward kill percentage
COUNTITEM Counts toward item percentage
NOTDMATCH Is not being spawned in Deathmatch games.
NOLIFTDROP Does not drop when a lift under it lowers
STEALTH Stealth monster
ICECORPSE Actor is a frozen corpse
LOWGRAVITY Actor is subject to low gravity
WINDTHRUST Actor is thrust by the Heretic wind specials. I hope its
functionality is some day expanded to the Boom wind specials
HERETICBOUNCE Heretic style bouncing (objects only bounce off the floor)
HEXENBOUNCE Hexen style bouncing (objects bounce off floors and walls)
DOOMBOUNCE ZDoom style bouncing (like hexen but stops when losing a certain
amount of momentum)
The 3 bounce types are mutually exclusive
FLOORCLIP Actor's lower part is clipped when standing in a sector
with a liquid texture (defined in the TERRAIN lump)
SPAWNFLOAT Actor is spawned hat a random height in the sector.
NOTELEPORT Actor cannot teleport
RIPPER For projectiles that can rip through monsters and players.
PUSHABLE Actor can be pushed.
SLIDESONWALLS Actor can slide along walls
CANPASS Actor uses height sensitive collision detection. Use with care!
This only makes sense on actors that can move by themselves.
CANNOTPUSH This actor cannot push pushable objects.
THRUGHOST This actor passes through ghosts (set with the GHOST flag.)
BOSS Actor is a boss. Bosses have a few special properties
(like playing some sounds at full volume.)
FIREDAMAGE Actor inflicts fire damage.
ICEDAMAGE Actor inflicts ice damage.
NODAMAGETHRUST Upon hitting another actor the victim is not thrust when damaged.
TELESTOMP This actor can telefrag others.
FLOATBOB use float bobbing z movement like Heretic/Hexen's powerups
ACTIVATEIMPACT Upon hitting a wall this actor can activate G1/GR lines
CANPUSHWALLS Upon hitting a wall this actor can activate P1/PR lines
ACTIVATEMCROSS This actor can activate 'Monster crosses' lines.
ACTIVATEPCROSS This actor can activate 'Projectile crosses' lines.
CANTLEAVEFLOORPIC This actor cannot cross into a sector with a different floor
texture.
NONSHOOTABLE Actor cannot be hit (projectiles pass through.)
INVULNERABLE Actor cannot be hurt.
DORMANT Actor is dormant and has to be activated with Thing_Activate.
SEEKERMISSILE Actor is a homing missile. This is only used as a hint to the
game. For a homing missile to be effective it has to use
one of the seeker missile code pointers in its moving states.
REFLECTIVE Actor reflects missiles shot at it.
FLOORHUGGER defines a projectile that is moving along the floor.
CEILINGHUGGER defines a projectile that is moving along the ceiling.
NORADIUSDMG Actor cannot be hurt by radius (explosive) damage.
GHOST Actor is a ghost. This does not imply translucency etc.
DONTSPLASH Actor does not create any terrain splashes
DONTOVERLAP Two actors with this flag cannot overlap at the same x/y-position
but different heights
DONTMORPH Cannot be morphed into a chicken or pig.
DONTSQUASH This actor cannot be instantly killed by Heretic's powered up Mace.
FULLVOLACTIVE Plays its active sound at full volume
ISMONSTER Actor is a monster
SKYEXPLODE Projectile explodes when hitting a sky instead of vanishing
STAYMORPHED If morphed this actor cannot revert to its original form.
DONTBLAST Cannot be blasted by Hexen's Disc of Repulsion.
CANBLAST Can be blasted by Hexen's Disc of Repulsion. For monsters this is
implicit.
NOTARGET cannot be targeted by other monsters.
DONTGIB cannot be crushed to a pile of blood.
NOBLOCKMONST can walk through monster blocking lines.
FULLVOLDEATH Plays its death sound at full volume
CANBOUNCEWATER Can bounce on water. Normally an object is destroyed in this case.
NOWALLBOUNCESND Does not play a sound when bouncing off a wall. Normally the
Seesound is played in this case.
FOILINVUL Can hurt invulnerable monsters (but not players.)
NOTELEOTHER Cannot be teleported by Hexen's banishment device.
QUICKTORETALIATE Immediately switches targets when being attacked.
NOICEDEATH Monster cannot be frozen, used to prevent the generic ice death.
RANDOMIZE Randomizes the duration for its first frame. Most of Doom's projectiles
use this.
FIXMAPTHINGPOS Move thing out of walls. For torches and similar things that tend to be
placed directly on a wall.
ACTLIKEBRIDGE Uses the special collision logic for bridge things.
STRIFEDAMAGE Strife uses a different damage calculation for its projectiles.
States (a.k.a. Frames)
======================
States define the behavior of an actor. For any regular actor there are the following
labels:
SPAWN defines the state that is displayed when an actor is spawned
For monsters this is normally also the idle loop.
SEE defines the walking animation for a monster.
MELEE defines the melee (near) attack.
MISSILE defines the missile (far) attack.
PAIN defines the pain action
DEATH defines the normal death sequence
XDEATH defines the extreme (splatter) death sequence
BURN defines the burn (fire) death sequence
ICE defines the freeze (ice) death sequence
RAISE defines the resurrection sequence (for the Arch Vile)
CRASH defines the crash sequence. This is entered when the actor
is a corpse and hits the floor.
A state definition is started with the 'STATES' keyword and enclosed
by braces '{', '}'.
A state definition consists of the following:
1) State labels. This is one of the keywords listed above followed by a ':'.
Example
Spawn:
defines the entry point for the spawn state.
2) State definitions. These consist of a sprite name, a frame sequence,
the duration in tics (1/35 seconds) and optionally the 'BRIGHT'
keyword to indicate a fullbright display and an action function name
(code pointer)
Example
POSS AABBCCDD 4 A_Chase
This defines 8 states. Each one of them uses the sprite POSS, has a duration
of 4 and uses the code pointer A_Chase which is the standard walk function
for monsters. Of these 8 states the first 2 will use the sprite frame 'A',
the next 2 the frame 'B' and so on. The length of theframe sequence can be
up to 256 characters. Valid frames are 'A'-'Z', '[', '\' and ']'.
Different sprites can be freely mixed in an actor definition each separate
state definition is limited to one sprite only.
3) Jump instructions
There are 4 different jump instructions:
-Loop jumps to the most recently defined state label. This is
used for a looping animation
-Stop Stops animating this actor. Normally this is used at the
end of the death sequences.
-Wait Loops the last defined state. This is only useful if a
code pointer is used that waits a given time or for a
certain event. Currently the only usable code pointer
for this is A_FreezeDeathChunks which is normally used
at the end of a freeze death sequence.
-Goto label+offset
Jumps to an arbitrary state in the current actor.
With this you can also jump to a state that was
inherited by a parent. See Example 2) above for this
The 'Goto see' jumps to the walking animation that
has been inherited.
Important note:
---------------
This format has been designed for maximum flexibility. As a result no assumptions
are made what the designer wants. No states are ever implicitly created.
Action functions:
=================
This information is kept rather brief. For normal purposes in-depth information
is not necessary. All action functions names are preceded by 'A_'.
A_BFGSpray Starts the effect when a BFG projectile hits something
A_Pain Plays the pain sound (that's all it does, it can also be used outside the pain sequence!)
A_NoBlocking Sets the actor to non-blocking and drops items.
A_XScream Plays the sound 'misc/gibbed'
A_Look Look for players - used in the idle sequence of monsters
A_Chase Standard walking function - used in the walk sequence of monsters
A_FaceTarget Change angle to face target
A_PosAttack Zombie attack (one bullet)
A_Scream Plays the death sound (that's all it does, it can also be used outside the death sequence!)
A_SPosAttack Shotgunner attack (3 bullets)
A_VileChase Arch Vile: look for corpses and walk.
A_VileStart Plays sound 'vile/start'
A_VileTarget Spawns the Arch Vile fire.
A_VileAttack Arch Vile attack function. Inflicts some damage and thrusts victim in the air.
A_Fire Keeps Arch Vile's fire in front of target
A_StartFire Plays sound 'vile/firestrt' and calls A_Fire
A_FireCrackle Plays sound 'vile/firecrkl' and calls A_Fire
A_Tracer Homing routine for Revenant's missile
A_SkelWhoosh Calls A_FaceTarget and plays sound 'skeleton/swing'.
A_SkelFist Revenant's melee attack.
A_SkelMissile Revenant's missile attack
A_FatRaise Calls A_FaceTarget and plays sound 'fatso/raiseguns'.
A_FatAttack1 Mancubus attack 1
A_FatAttack2 Mancubus attack 2
A_FatAttack3 Mancubus attack 3
A_BossDeath Boss death specials. Has no effect for custom monsters
A_CPosAttack Chaingunner attack
A_CPosRefire Chaingunner refiring
A_TroopAttack Imp attack
A_SargAttack Demon attack
A_HeadAttack Cacodemon attack
A_BruisAttack Baron attack
A_SkullAttack Lost Soul attack
A_Metal Plays 'spider/metal' and calls A_Chase
A_SpidRefire Spider refiring
A_BabyMetal Plays 'baby/walk' and calls A_Chase
A_BspiAttack Arachnotron attack
A_Hoof Plays 'cyber/hoof' and calls A_Chase
A_CyberAttack Cyberdemon attack
A_PainAttack Pain Elemental attack
A_PainDie Pain Elemental death
A_KeenDie Keen death - opens door with tag 666 if all monsters of the calling kind are dead.
A_BrainPain Plays 'brain/pain' at full volume.
A_BrainScream Starts brain explosion
A_BrainDie Ends level if not in deathmatch
A_BrainAwake Plays 'brain/sight' at full volume.
A_BrainSpit Spits one brain cube
A_SpawnFly Brain cube handling incl. monster creation
A_SpawnSound plays 'brain/cube' and calls A_SpawnFly
A_BrainExplode Brain explosion
A_Die Kills actor
A_Detonate Inflicts explosive damage - amount specified by DAMAGE in the actor
A_Mushroom Shoots a lot of mancubus fireballs high in the air
A_SetFloorClip Sets the FLOORCLIP flag
A_UnSetFloorClip Clears the FLOORCLIP flag
A_HideThing Makes actor invisible
A_UnHideThing Makes actor visible
A_SetInvulnerable Makes actor invulnerable
A_UnSetInvulnerable Makes actor vulnerable
A_SetReflective Sets the REFLECTIVE flag
A_UnSetReflective Clears the REFLECTIVE flag
A_SetReflectiveInvulnerable A_SetInvulnerable + A_SetReflective
A_UnSetReflectiveInvulnerable A_UnSetInvulnerable + A_UnSetReflective
A_SetShootable Makes actor shootable
A_UnSetShootable Makes actor non shootable
A_NoGravity makes Actor not subject to gravity
A_Gravity makes Actor subject to gravity
A_LowGravity makes Actor subject to low gravity
A_ScreamAndUnblock combines A_Scream and A_NoBlocking
A_ActiveSound plays actor's active sound
A_ActiveAndUnblock combines A_ActiveSound and A_NoBlocking
A_FastChase A_Chase variation used by Hexen's class bosses
A_FreezeDeath Starts the freeze death sequence.
A_GenericFreezeDeath Starts the generic freeze death sequence. Calls A_FreezeDeath and sets the ice palette translation.
A_FreezeDeathChunks Burst the actor into chunks. The state with this function has to be looped because it waits until all movement has stopped.
A_IceGuyDie Stops all movement and bursts the actor into ice chunks immediately.
The following functions use some actor properties to determine their behavior
-----------------------------------------------------------------------------
A_Explode Inflicts explosive damage.
Uses:
ExplosionDamage Amount of damage being inflicted
ExplosionRadius Radius of damage
DontHurtShooter If a projectile, don't hurt the guy who shot it.
A_MeleeAttack performs a melee attack
Uses:
MeleeDamage Amount of damage, The formula is random(1,8)*MeleeDamage
MeleeSound Sound being played if the actual attack happens.
A_MissileAttack launches a missile
Uses:
MissileName Actor name of the missile being launched
MissileHeight Height above floor for the spawned missile
A_MissileAttack can handle homing missiles as long as the missile
has the SEEKERMISSILE flag set and contains some kind of tracer
code pointer (A_Tracer, A_MummyFX1Seek, etc.) In its moving animation.
A_ComboAttack combines A_MeleeAttack and A_MissileAttack depending on the current
distance to the target.
A_BulletAttack Hitscan attack
Uses:
damage amount of bullets being fired
The following functions use direct parameters:
----------------------------------------------
A_PlaySound ("soundname") Plays the sound soundname
A_PlayWeaponSound ("soundname") Plays the sound soundname on the weapon channel
Sounds played with A_PlaySound and A_PlayWeaponSound
can occur simultaneously.
A_SeekerMissile (threshold, maxturnangle)
Seeker missile handling. threshold and maxturnangle determine
how 'aggressive' the missile will home in on its target. The larger
the values the more precise it is. threshold specifies the angle
inside which the missile will home in directly on its target.
If the angle toward the target is larger than threshold it will
change its movement angle only partially towards the target.
maxturnangle is the maximum change of movement direction that
will be performed in one move. Maxturnangle should be larger
than threshold. Both angles are specified in degrees and must be
in the range [0, 90].
Example: The flaming skull of Heretic's mummy uses an equivalent
of A_SeekerMisile 20 30
A_Jump (chance, distance) Randomly advances to different state. Like painchance, the chance
value can range between 0 and 255. A chance of 0 will never advance,
while a chance of 255 will almost always advance. If the state is
not advanced, then the one immediately following the A_Jump will
be used as if A_Jump had not been present.
A_CustomMissile ("missiletype", spawnheight, spawnofs_xy, angle)
Spawns a missile attack where "missiletype" is the type of missile
to shoot, spawnheight is how high from the monster's feet to shoot
the missile, spawnofs_xy is how far the monster's center to shoot
the missile, and angle is the direction relative to the monster's
facing angle in which to shoot the missile.

View file

@ -279,6 +279,7 @@ enum
MF5_BOUNCEONACTORS = 0x00000008, // bouncing missile doesn't explode when it hits an actor MF5_BOUNCEONACTORS = 0x00000008, // bouncing missile doesn't explode when it hits an actor
MF5_EXPLODEONWATER = 0x00000010, // bouncing missile explpdes when hitting a water surface MF5_EXPLODEONWATER = 0x00000010, // bouncing missile explpdes when hitting a water surface
MF5_AVOIDINGDROPOFF = 0x00000020, // Used to move monsters away fro dropoffs MF5_AVOIDINGDROPOFF = 0x00000020, // Used to move monsters away fro dropoffs
MF5_NODAMAGE = 0x00000040, // Actor can be shot and reacts to being shot but takes no damage
// --- mobj.renderflags --- // --- mobj.renderflags ---
@ -398,6 +399,8 @@ enum
AMETA_BloodColor, // colorized blood AMETA_BloodColor, // colorized blood
AMETA_GibHealth, // negative health below which this monster dies an extreme death AMETA_GibHealth, // negative health below which this monster dies an extreme death
AMETA_WoundHealth, // health needed to enter wound state AMETA_WoundHealth, // health needed to enter wound state
AMETA_PoisonDamage, // Amount of poison damage
AMETA_FastSpeed, // Speed in fast mode
}; };
// Map Object definition. // Map Object definition.

View file

@ -552,13 +552,14 @@ BOOL C_DoKey (event_t *ev)
} }
} }
if (binding == NULL)
if (binding == NULL || *binding==0)
{ {
binding = Bindings[ev->data1]; binding = Bindings[ev->data1];
dclick = false; dclick = false;
} }
if (binding != NULL && (chatmodeon == 0 || ev->data1 < 256)) if (binding != NULL && *binding!=0 && (chatmodeon == 0 || ev->data1 < 256))
{ {
if (ev->type == EV_KeyUp) if (ev->type == EV_KeyUp)
{ {

View file

@ -124,7 +124,8 @@ FState AStaff::States[] =
IMPLEMENT_ACTOR (AStaff, Heretic, -1, 0) IMPLEMENT_ACTOR (AStaff, Heretic, -1, 0)
PROP_Weapon_SelectionOrder (3800) PROP_Weapon_SelectionOrder (3800)
PROP_Weapon_Flags (WIF_WIMPY_WEAPON|WIF_HITS_GHOSTS|WIF_BOT_MELEE) PROP_Flags2Set(MF2_THRUGHOST)
PROP_Weapon_Flags (WIF_WIMPY_WEAPON|WIF_BOT_MELEE)
PROP_Weapon_UpState (S_STAFFUP) PROP_Weapon_UpState (S_STAFFUP)
PROP_Weapon_DownState (S_STAFFDOWN) PROP_Weapon_DownState (S_STAFFDOWN)
PROP_Weapon_ReadyState (S_STAFFREADY) PROP_Weapon_ReadyState (S_STAFFREADY)
@ -134,7 +135,7 @@ IMPLEMENT_ACTOR (AStaff, Heretic, -1, 0)
END_DEFAULTS END_DEFAULTS
IMPLEMENT_STATELESS_ACTOR (AStaffPowered, Heretic, -1, 0) IMPLEMENT_STATELESS_ACTOR (AStaffPowered, Heretic, -1, 0)
PROP_Weapon_Flags (WIF_WIMPY_WEAPON|WIF_HITS_GHOSTS|WIF_READYSNDHALF|WIF_POWERED_UP|WIF_BOT_MELEE|WIF_STAFF2_KICKBACK) PROP_Weapon_Flags (WIF_WIMPY_WEAPON|WIF_READYSNDHALF|WIF_POWERED_UP|WIF_BOT_MELEE|WIF_STAFF2_KICKBACK)
PROP_Weapon_UpState (S_STAFFUP2) PROP_Weapon_UpState (S_STAFFUP2)
PROP_Weapon_DownState (S_STAFFDOWN2) PROP_Weapon_DownState (S_STAFFDOWN2)
PROP_Weapon_ReadyState (S_STAFFREADY2) PROP_Weapon_ReadyState (S_STAFFREADY2)

View file

@ -1,187 +0,0 @@
// Projectiles intended to be spawned through ACS
#include "actor.h"
#include "info.h"
#include "p_local.h"
// Fire Ball ----------------------------------------------------------------
class AFireBall : public AActor
{
DECLARE_ACTOR (AFireBall, AActor)
};
FState AFireBall::States[] =
{
#define S_FIREBALL1_1 0
S_BRIGHT (FBL1, 'A', 4, NULL , &States[S_FIREBALL1_1+1]),
S_BRIGHT (FBL1, 'B', 4, NULL , &States[S_FIREBALL1_1]),
#define S_FIREBALL1_X1 (S_FIREBALL1_1+2)
S_BRIGHT (XPL1, 'A', 4, NULL , &States[S_FIREBALL1_X1+1]),
S_BRIGHT (XPL1, 'B', 4, NULL , &States[S_FIREBALL1_X1+2]),
S_BRIGHT (XPL1, 'C', 4, NULL , &States[S_FIREBALL1_X1+3]),
S_BRIGHT (XPL1, 'D', 4, NULL , &States[S_FIREBALL1_X1+4]),
S_BRIGHT (XPL1, 'E', 4, NULL , &States[S_FIREBALL1_X1+5]),
S_BRIGHT (XPL1, 'F', 4, NULL , NULL),
};
IMPLEMENT_ACTOR (AFireBall, Hexen, -1, 10)
PROP_SpeedFixed (2)
PROP_RadiusFixed (8)
PROP_HeightFixed (8)
PROP_Damage (4)
PROP_DamageType (MOD_FIRE)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_RenderStyle (STYLE_Add)
PROP_SpawnState (S_FIREBALL1_1)
PROP_DeathState (S_FIREBALL1_X1)
PROP_DeathSound ("Fireball")
END_DEFAULTS
// Arrow --------------------------------------------------------------------
class AArrow : public AActor
{
DECLARE_ACTOR (AArrow, AActor)
};
FState AArrow::States[] =
{
#define S_ARROW_1 0
S_NORMAL (ARRW, 'A', -1, NULL , NULL),
#define S_ARROW_X1 (S_ARROW_1+1)
S_NORMAL (ARRW, 'A', 1, NULL , NULL),
};
IMPLEMENT_ACTOR (AArrow, Hexen, -1, 50)
PROP_SpeedFixed (6)
PROP_RadiusFixed (8)
PROP_HeightFixed (4)
PROP_Damage (4)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_SpawnState (S_ARROW_1)
PROP_DeathState (S_ARROW_X1)
END_DEFAULTS
// Dart ---------------------------------------------------------------------
class ADart : public AActor
{
DECLARE_ACTOR (ADart, AActor)
};
FState ADart::States[] =
{
#define S_DART_1 0
S_NORMAL (DART, 'A', -1, NULL , NULL),
#define S_DART_X1 (S_DART_1+1)
S_NORMAL (DART, 'A', 1, NULL , NULL),
};
IMPLEMENT_ACTOR (ADart, Hexen, -1, 51)
PROP_SpeedFixed (6)
PROP_RadiusFixed (8)
PROP_HeightFixed (4)
PROP_Damage (2)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_SpawnState (S_DART_1)
PROP_DeathState (S_DART_X1)
END_DEFAULTS
// Poison Dart --------------------------------------------------------------
class APoisonDart : public ADart
{
DECLARE_STATELESS_ACTOR (APoisonDart, ADart)
public:
int DoSpecialDamage (AActor *victim, int damage);
};
IMPLEMENT_STATELESS_ACTOR (APoisonDart, Hexen, -1, 52)
END_DEFAULTS
int APoisonDart::DoSpecialDamage (AActor *victim, int damage)
{
if (victim->player)
{
P_PoisonPlayer (victim->player, this, this->target, 20);
damage >>= 1;
}
return damage;
}
// Ripper Ball --------------------------------------------------------------
class ARipperBall : public AActor
{
DECLARE_ACTOR (ARipperBall, AActor)
};
FState ARipperBall::States[] =
{
#define S_RIPPERBALL_1 0
S_NORMAL (RIPP, 'A', 3, NULL , &States[S_RIPPERBALL_1+1]),
S_NORMAL (RIPP, 'B', 3, NULL , &States[S_RIPPERBALL_1+2]),
S_NORMAL (RIPP, 'C', 3, NULL , &States[S_RIPPERBALL_1]),
#define S_RIPPERBALL_X1 (S_RIPPERBALL_1+3)
S_BRIGHT (CFCF, 'Q', 4, NULL , &States[S_RIPPERBALL_X1+1]),
S_BRIGHT (CFCF, 'R', 3, NULL , &States[S_RIPPERBALL_X1+2]),
S_BRIGHT (CFCF, 'S', 4, NULL , &States[S_RIPPERBALL_X1+3]),
S_BRIGHT (CFCF, 'T', 3, NULL , &States[S_RIPPERBALL_X1+4]),
S_BRIGHT (CFCF, 'U', 4, NULL , &States[S_RIPPERBALL_X1+5]),
S_BRIGHT (CFCF, 'V', 3, NULL , &States[S_RIPPERBALL_X1+6]),
S_BRIGHT (CFCF, 'W', 4, NULL , &States[S_RIPPERBALL_X1+7]),
S_BRIGHT (CFCF, 'X', 3, NULL , &States[S_RIPPERBALL_X1+8]),
S_BRIGHT (CFCF, 'Y', 4, NULL , &States[S_RIPPERBALL_X1+9]),
S_BRIGHT (CFCF, 'Z', 3, NULL , NULL),
};
IMPLEMENT_ACTOR (ARipperBall, Hexen, -1, 53)
PROP_SpeedFixed (6)
PROP_RadiusFixed (8)
PROP_Damage (2)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT|MF2_RIP)
PROP_SpawnState (S_RIPPERBALL_1)
PROP_DeathState (S_RIPPERBALL_X1)
END_DEFAULTS
// Projectile Blade ---------------------------------------------------------
class AProjectileBlade : public AActor
{
DECLARE_ACTOR (AProjectileBlade, AActor)
};
FState AProjectileBlade::States[] =
{
#define S_PRJ_BLADE1 0
S_NORMAL (BLAD, 'A', -1, NULL , NULL),
#define S_PRJ_BLADE_X1 (S_PRJ_BLADE1+1)
S_NORMAL (BLAD, 'A', 1, NULL , NULL),
};
IMPLEMENT_ACTOR (AProjectileBlade, Hexen, -1, 64)
PROP_SpeedFixed (6)
PROP_RadiusFixed (6)
PROP_HeightFixed (6)
PROP_Damage (3)
PROP_Flags (MF_NOBLOCKMAP|MF_NOGRAVITY|MF_DROPOFF|MF_MISSILE)
PROP_Flags2 (MF2_NOTELEPORT)
PROP_SpawnState (S_PRJ_BLADE1)
PROP_DeathState (S_PRJ_BLADE_X1)
END_DEFAULTS

View file

@ -15,11 +15,6 @@ protected:
virtual bool ShouldStay (); virtual bool ShouldStay ();
}; };
class AStrifeKey : public AKey
{
DECLARE_STATELESS_ACTOR (AStrifeKey, AKey)
};
bool P_CheckKeys (AActor *owner, int keynum, bool remote); bool P_CheckKeys (AActor *owner, int keynum, bool remote);
void P_InitKeyMessages (); void P_InitKeyMessages ();
int P_GetMapColorForLock (int lock); int P_GetMapColorForLock (int lock);

View file

@ -12,6 +12,7 @@
#include "c_dispatch.h" #include "c_dispatch.h"
#include "gstrings.h" #include "gstrings.h"
#include "templates.h" #include "templates.h"
#include "a_strifeglobal.h"
static FRandom pr_restore ("RestorePos"); static FRandom pr_restore ("RestorePos");
@ -1102,6 +1103,21 @@ bool AInventory::DoRespawn ()
return true; return true;
} }
//===========================================================================
//
// AInventory :: GiveQuest
//
//===========================================================================
void AInventory::GiveQuest (AActor *toucher)
{
int quest = GetClass()->Meta.GetMetaInt(AIMETA_GiveQuest);
if (quest>0 && quest<31)
{
toucher->GiveInventoryType (QuestItemClasses[quest-1]);
}
}
//=========================================================================== //===========================================================================
// //
// AInventory :: TryPickup // AInventory :: TryPickup
@ -1169,6 +1185,8 @@ bool AInventory::TryPickup (AActor *toucher)
} }
} }
} }
GiveQuest(toucher);
return true; return true;
} }
@ -1271,6 +1289,7 @@ bool ACustomInventory::TryPickup (AActor *toucher)
} }
else if (useok || ItemFlags & IF_ALWAYSPICKUP) else if (useok || ItemFlags & IF_ALWAYSPICKUP)
{ {
GiveQuest (toucher);
GoAwayAndDie(); GoAwayAndDie();
} }
return useok; return useok;
@ -2049,6 +2068,7 @@ IMPLEMENT_ABSTRACT_ACTOR (AMapRevealer)
bool AMapRevealer::TryPickup (AActor *toucher) bool AMapRevealer::TryPickup (AActor *toucher)
{ {
level.flags |= LEVEL_ALLMAP; level.flags |= LEVEL_ALLMAP;
GiveQuest (toucher);
GoAwayAndDie (); GoAwayAndDie ();
return true; return true;
} }

View file

@ -69,6 +69,7 @@ enum
{ {
AIMETA_BASE = 0x71000, AIMETA_BASE = 0x71000,
AIMETA_PickupMessage, // string AIMETA_PickupMessage, // string
AIMETA_GiveQuest, // optionally give one of the quest items.
}; };
enum enum
@ -145,6 +146,9 @@ public:
virtual PalEntry GetBlend (); virtual PalEntry GetBlend ();
protected:
void GiveQuest(AActor * toucher);
private: private:
static int StaticLastMessageTic; static int StaticLastMessageTic;
static const char *StaticLastMessage; static const char *StaticLastMessage;
@ -260,7 +264,7 @@ enum
WIF_WIMPY_WEAPON = 0x00000200, // change away when ammo for another weapon is replenished WIF_WIMPY_WEAPON = 0x00000200, // change away when ammo for another weapon is replenished
WIF_POWERED_UP = 0x00000400, // this is a tome-of-power'ed version of its sister WIF_POWERED_UP = 0x00000400, // this is a tome-of-power'ed version of its sister
WIF_EXTREME_DEATH = 0x00000800, // weapon always causes an extreme death WIF_EXTREME_DEATH = 0x00000800, // weapon always causes an extreme death
WIF_HITS_GHOSTS = 0x00001000, // melee weapon can strike ghosts
WIF_STAFF2_KICKBACK = 0x00002000, // the powered-up Heretic staff has special kickback WIF_STAFF2_KICKBACK = 0x00002000, // the powered-up Heretic staff has special kickback
WIF_CHEATNOTWEAPON = 1<<27, // Give cheat considers this not a weapon (used by Sigil) WIF_CHEATNOTWEAPON = 1<<27, // Give cheat considers this not a weapon (used by Sigil)

View file

@ -92,6 +92,7 @@ bool AWeaponPiece::TryPickup (AActor *toucher)
{ {
// Already has the piece, check if mana needed // Already has the piece, check if mana needed
if (!gaveAmmo) return false; if (!gaveAmmo) return false;
GiveQuest (toucher);
GoAwayAndDie(); GoAwayAndDie();
return true; return true;
} }
@ -114,6 +115,7 @@ bool AWeaponPiece::TryPickup (AActor *toucher)
FullWeapon->AmmoGive2=Defaults->AmmoGive2; FullWeapon->AmmoGive2=Defaults->AmmoGive2;
} }
} }
GiveQuest (toucher);
GoAwayAndDie(); GoAwayAndDie();
return true; return true;
} }

View file

@ -7,6 +7,7 @@
#include "m_random.h" #include "m_random.h"
#include "a_strifeglobal.h" #include "a_strifeglobal.h"
#include "c_console.h" #include "c_console.h"
#include "gstrings.h"
static FRandom pr_spectrespawn ("AlienSpectreSpawn"); static FRandom pr_spectrespawn ("AlienSpectreSpawn");
static FRandom pr_212e4 ("212e4"); static FRandom pr_212e4 ("212e4");
@ -510,13 +511,13 @@ void A_AlienSpectreDeath (AActor *self)
} }
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2)) else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre2))
{ {
C_MidPrint("You Killed The Bishop!"); C_MidPrint(GStrings("TXT_KILLED_BISHOP"));
log = 74; log = 74;
player->GiveInventoryType (QuestItemClasses[20]); player->GiveInventoryType (QuestItemClasses[20]);
} }
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre3)) else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre3))
{ {
C_MidPrint("You've Killed The Oracle!"); C_MidPrint(GStrings("TXT_KILLED_ORACLE"));
// If there are any Oracles still alive, kill them. // If there are any Oracles still alive, kill them.
TThinkerIterator<AOracle> it; TThinkerIterator<AOracle> it;
AOracle *oracle; AOracle *oracle;
@ -546,7 +547,7 @@ void A_AlienSpectreDeath (AActor *self)
} }
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre4)) else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre4))
{ {
C_MidPrint("You Killed Macil!"); C_MidPrint(GStrings("TXT_KILLED_MACIL"));
player->GiveInventoryType (QuestItemClasses[23]); player->GiveInventoryType (QuestItemClasses[23]);
if (player->FindInventory (QuestItemClasses[24]) == NULL) if (player->FindInventory (QuestItemClasses[24]) == NULL)
{ // Richter has taken over. Macil is a snake. { // Richter has taken over. Macil is a snake.
@ -559,7 +560,7 @@ void A_AlienSpectreDeath (AActor *self)
} }
else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre5)) else if (self->GetClass() == RUNTIME_CLASS(AAlienSpectre5))
{ {
C_MidPrint("You've Killed the Loremaster!"); C_MidPrint(GStrings("TXT_KILLED_LOREMASTER"));
ASigil *sigil; ASigil *sigil;
player->GiveInventoryType (QuestItemClasses[25]); player->GiveInventoryType (QuestItemClasses[25]);

View file

@ -1,161 +0,0 @@
#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "s_sound.h"
#include "a_strifeglobal.h"
void A_SentinelRefire (AActor *);
void A_PeasantAttack (AActor *);
void A_TossGib (AActor *);
// Base class for the beggars ---------------------------------------------
class ABeggar : public AStrifeHumanoid
{
DECLARE_ACTOR (ABeggar, AStrifeHumanoid);
};
FState ABeggar::States[] =
{
#define S_BEGGAR_STND 0
S_NORMAL (BEGR, 'A', 10, A_Look, &States[S_BEGGAR_STND]),
#define S_BEGGAR_RUN (S_BEGGAR_STND+1)
S_NORMAL (BEGR, 'A', 4, A_Wander, &States[S_BEGGAR_RUN+1]),
S_NORMAL (BEGR, 'A', 4, A_Wander, &States[S_BEGGAR_RUN+2]),
S_NORMAL (BEGR, 'B', 4, A_Wander, &States[S_BEGGAR_RUN+3]),
S_NORMAL (BEGR, 'B', 4, A_Wander, &States[S_BEGGAR_RUN+4]),
S_NORMAL (BEGR, 'C', 4, A_Wander, &States[S_BEGGAR_RUN+5]),
S_NORMAL (BEGR, 'C', 4, A_Wander, &States[S_BEGGAR_RUN]),
#define S_BEGGAR_ATTACK (S_BEGGAR_RUN+6)
S_NORMAL (BEGR, 'D', 8, NULL, &States[S_BEGGAR_ATTACK+1]),
S_NORMAL (BEGR, 'E', 8, A_PeasantAttack, &States[S_BEGGAR_ATTACK+2]),
S_NORMAL (BEGR, 'E', 1, A_Chase, &States[S_BEGGAR_ATTACK+3]),
S_NORMAL (BEGR, 'D', 8, A_SentinelRefire, &States[S_BEGGAR_ATTACK]),
#define S_BEGGAR_PAIN (S_BEGGAR_ATTACK+4)
S_NORMAL (BEGR, 'A', 3, A_Pain, &States[S_BEGGAR_PAIN+1]),
S_NORMAL (BEGR, 'A', 3, A_Chase, &States[S_BEGGAR_ATTACK]),
#define S_BEGGAR_DIE (S_BEGGAR_PAIN+2)
S_NORMAL (BEGR, 'F', 4, NULL, &States[S_BEGGAR_DIE+1]),
S_NORMAL (BEGR, 'G', 4, A_Scream, &States[S_BEGGAR_DIE+2]),
S_NORMAL (BEGR, 'H', 4, NULL, &States[S_BEGGAR_DIE+3]),
S_NORMAL (BEGR, 'I', 4, A_NoBlocking, &States[S_BEGGAR_DIE+4]),
S_NORMAL (BEGR, 'J', 4, NULL, &States[S_BEGGAR_DIE+5]),
S_NORMAL (BEGR, 'K', 4, NULL, &States[S_BEGGAR_DIE+6]),
S_NORMAL (BEGR, 'L', 4, NULL, &States[S_BEGGAR_DIE+7]),
S_NORMAL (BEGR, 'M', 4, NULL, &States[S_BEGGAR_DIE+8]),
S_NORMAL (BEGR, 'N', -1, NULL, NULL),
#define S_BEGGAR_XDIE (S_BEGGAR_DIE+9)
S_NORMAL (BEGR, 'F', 5, A_TossGib, &States[S_BEGGAR_XDIE+1]),
S_NORMAL (GIBS, 'M', 5, A_TossGib, &States[S_BEGGAR_XDIE+2]),
S_NORMAL (GIBS, 'N', 5, A_XScream, &States[S_BEGGAR_XDIE+3]),
S_NORMAL (GIBS, 'O', 5, A_NoBlocking, &States[S_BEGGAR_XDIE+4]),
S_NORMAL (GIBS, 'P', 4, A_TossGib, &States[S_BEGGAR_XDIE+5]),
S_NORMAL (GIBS, 'Q', 4, A_TossGib, &States[S_BEGGAR_XDIE+6]),
S_NORMAL (GIBS, 'R', 4, A_TossGib, &States[S_BEGGAR_XDIE+7]),
S_NORMAL (GIBS, 'S', 4, A_TossGib, &States[S_BEGGAR_XDIE+8]),
S_NORMAL (GIBS, 'T', 4, A_TossGib, &States[S_BEGGAR_XDIE+9]),
S_NORMAL (GIBS, 'U', 5, NULL, &States[S_BEGGAR_XDIE+10]),
S_NORMAL (GIBS, 'V', 1400, NULL, NULL),
};
IMPLEMENT_ACTOR (ABeggar, Strife, 0, 0)
PROP_SpawnState (S_BEGGAR_STND)
PROP_SeeState (S_BEGGAR_RUN)
PROP_PainState (S_BEGGAR_PAIN)
PROP_MeleeState (S_BEGGAR_ATTACK)
PROP_DeathState (S_BEGGAR_DIE)
PROP_XDeathState (S_BEGGAR_XDIE)
PROP_SpawnHealth (20)
PROP_PainChance (250)
PROP_SpeedFixed (3)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_JUSTHIT)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_ISMONSTER)
PROP_Flags4 (MF4_NOSPLASHALERT)
PROP_MinMissileChance (150)
PROP_Tag ("Beggar")
PROP_AttackSound ("beggar/attack")
PROP_PainSound ("beggar/pain")
PROP_DeathSound ("beggar/death")
END_DEFAULTS
// Beggar 1 -----------------------------------------------------------------
class ABeggar1 : public ABeggar
{
DECLARE_STATELESS_ACTOR (ABeggar1, ABeggar)
};
IMPLEMENT_STATELESS_ACTOR (ABeggar1, Strife, 141, 0)
PROP_StrifeType (38)
PROP_StrifeTeaserType (37)
PROP_StrifeTeaserType2 (38)
PROP_Tag ("Beggar")
END_DEFAULTS
// Beggar 2 -----------------------------------------------------------------
class ABeggar2 : public ABeggar
{
DECLARE_STATELESS_ACTOR (ABeggar2, ABeggar)
};
IMPLEMENT_STATELESS_ACTOR (ABeggar2, Strife, 155, 0)
PROP_StrifeType (39)
PROP_StrifeTeaserType (38)
PROP_StrifeTeaserType2 (39)
PROP_Tag ("Beggar")
END_DEFAULTS
// Beggar 3 -----------------------------------------------------------------
class ABeggar3 : public ABeggar
{
DECLARE_STATELESS_ACTOR (ABeggar3, ABeggar)
};
IMPLEMENT_STATELESS_ACTOR (ABeggar3, Strife, 156, 0)
PROP_StrifeType (40)
PROP_StrifeTeaserType (39)
PROP_StrifeTeaserType2 (40)
PROP_Tag ("Beggar")
END_DEFAULTS
// Beggar 4 -----------------------------------------------------------------
class ABeggar4 : public ABeggar
{
DECLARE_STATELESS_ACTOR (ABeggar4, ABeggar)
};
IMPLEMENT_STATELESS_ACTOR (ABeggar4, Strife, 157, 0)
PROP_StrifeType (41)
PROP_StrifeTeaserType (40)
PROP_StrifeTeaserType2 (41)
PROP_Tag ("Beggar")
END_DEFAULTS
// Beggar 5 -----------------------------------------------------------------
class ABeggar5 : public ABeggar
{
DECLARE_STATELESS_ACTOR (ABeggar5, ABeggar)
};
IMPLEMENT_STATELESS_ACTOR (ABeggar5, Strife, 158, 0)
PROP_StrifeType (42)
PROP_StrifeTeaserType (41)
PROP_StrifeTeaserType2 (42)
PROP_Tag ("Beggar")
END_DEFAULTS

View file

@ -1,228 +0,0 @@
#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "s_sound.h"
void A_AlertOthers (AActor *);
void A_CloseUpShop (AActor *);
void A_ClearSoundTarget (AActor *);
void A_PlayActiveSound (AActor *);
// Base class for the merchants ---------------------------------------------
class AMerchant : public AActor
{
DECLARE_ACTOR (AMerchant, AActor)
public:
int TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, int damagetype);
};
FState AMerchant::States[] =
{
#define S_MERCHANT_YES 0
S_NORMAL (MRYS, 'A', 20, NULL, &States[S_MERCHANT_YES+6]),
#define S_MERCHANT_NO (S_MERCHANT_YES+1)
S_NORMAL (MRNO, 'A', 6, NULL, &States[S_MERCHANT_NO+1]),
S_NORMAL (MRNO, 'B', 6, NULL, &States[S_MERCHANT_NO+2]),
S_NORMAL (MRNO, 'C', 10, NULL, &States[S_MERCHANT_NO+3]),
S_NORMAL (MRNO, 'B', 6, NULL, &States[S_MERCHANT_NO+4]),
S_NORMAL (MRNO, 'A', 6, NULL, &States[S_MERCHANT_NO+5]),
#define S_MERCHANT_STND (S_MERCHANT_NO+5)
S_NORMAL (MRST, 'A', 10, A_Look2, &States[S_MERCHANT_STND]),
#define S_MERCHANT_LOOK1 (S_MERCHANT_STND+1)
// This actually uses A_LoopActiveSound, but since that doesn't actually
// loop in Strife, this is probably better, eh?
S_NORMAL (MRLK, 'A', 30, A_PlayActiveSound, &States[S_MERCHANT_STND]),
#define S_MERCHANT_LOOK2 (S_MERCHANT_LOOK1+1)
S_NORMAL (MRLK, 'B', 30, NULL, &States[S_MERCHANT_STND]),
#define S_MERCHANT_BD (S_MERCHANT_LOOK2+1)
S_NORMAL (MRBD, 'A', 4, NULL, &States[S_MERCHANT_BD+1]),
S_NORMAL (MRBD, 'B', 4, NULL, &States[S_MERCHANT_BD+2]),
S_NORMAL (MRBD, 'C', 4, NULL, &States[S_MERCHANT_BD+3]),
S_NORMAL (MRBD, 'D', 4, NULL, &States[S_MERCHANT_BD+4]),
S_NORMAL (MRBD, 'E', 4, NULL, &States[S_MERCHANT_BD+5]),
S_NORMAL (MRBD, 'D', 4, NULL, &States[S_MERCHANT_BD+6]),
S_NORMAL (MRBD, 'C', 4, NULL, &States[S_MERCHANT_BD+7]),
S_NORMAL (MRBD, 'B', 4, NULL, &States[S_MERCHANT_BD+8]),
S_NORMAL (MRBD, 'A', 5, NULL, &States[S_MERCHANT_BD+9]),
S_NORMAL (MRBD, 'F', 6, NULL, &States[S_MERCHANT_STND]),
#define S_MERCHANT_PAIN (S_MERCHANT_BD+10)
S_NORMAL (MRPN, 'A', 3, A_AlertOthers, &States[S_MERCHANT_PAIN+1]),
S_NORMAL (MRPN, 'B', 3, A_Pain, &States[S_MERCHANT_PAIN+2]),
S_NORMAL (MRPN, 'C', 3, NULL, &States[S_MERCHANT_PAIN+3]),
S_NORMAL (MRPN, 'D', 9, A_CloseUpShop, &States[S_MERCHANT_PAIN+4]),
S_NORMAL (MRPN, 'C', 4, NULL, &States[S_MERCHANT_PAIN+5]),
S_NORMAL (MRPN, 'B', 3, NULL, &States[S_MERCHANT_PAIN+6]),
S_NORMAL (MRPN, 'A', 3, A_ClearSoundTarget, &States[S_MERCHANT_STND]),
#define S_MERCHANT_GT (S_MERCHANT_PAIN+7)
S_NORMAL (MRGT, 'A', 5, NULL, &States[S_MERCHANT_GT+1]),
S_NORMAL (MRGT, 'B', 5, NULL, &States[S_MERCHANT_GT+2]),
S_NORMAL (MRGT, 'C', 5, NULL, &States[S_MERCHANT_GT+3]),
S_NORMAL (MRGT, 'D', 5, NULL, &States[S_MERCHANT_GT+4]),
S_NORMAL (MRGT, 'E', 5, NULL, &States[S_MERCHANT_GT+5]),
S_NORMAL (MRGT, 'F', 5, NULL, &States[S_MERCHANT_GT+6]),
S_NORMAL (MRGT, 'G', 5, NULL, &States[S_MERCHANT_GT+7]),
S_NORMAL (MRGT, 'H', 5, NULL, &States[S_MERCHANT_GT+8]),
S_NORMAL (MRGT, 'I', 5, NULL, &States[S_MERCHANT_STND])
};
IMPLEMENT_ACTOR (AMerchant, Strife, -1, 0)
PROP_SpawnState (S_MERCHANT_STND)
PROP_SeeState (S_MERCHANT_PAIN)
PROP_PainState (S_MERCHANT_PAIN)
PROP_GreetingsState (S_MERCHANT_GT)
PROP_YesState (S_MERCHANT_YES)
PROP_NoState (S_MERCHANT_NO)
PROP_SpawnHealthLong (10000000)
PROP_PainChance (150)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_Mass (5000)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_NOTDMATCH)
PROP_Flags4 (MF4_NOSPLASHALERT)
END_DEFAULTS
int AMerchant::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, int damagetype)
{
target = source;
if (PainState != NULL)
{
SetState (PainState);
}
return -1;
}
// Weapon Smith -------------------------------------------------------------
class AWeaponSmith : public AMerchant
{
DECLARE_STATELESS_ACTOR (AWeaponSmith, AMerchant)
};
IMPLEMENT_STATELESS_ACTOR (AWeaponSmith, Strife, 116, 0)
PROP_StrifeType (2)
PROP_StrifeTeaserType (2)
PROP_StrifeTeaserType2 (2)
PROP_PainSound ("smith/pain")
PROP_Tag ("Weapon_Smith")
END_DEFAULTS
// Bar Keep -----------------------------------------------------------------
class ABarKeep : public AMerchant
{
DECLARE_STATELESS_ACTOR (ABarKeep, AMerchant)
};
IMPLEMENT_STATELESS_ACTOR (ABarKeep, Strife, 72, 0)
PROP_Translation (TRANSLATION_Standard, 4)
PROP_StrifeType (3)
PROP_StrifeTeaserType (3)
PROP_StrifeTeaserType2 (3)
PROP_PainSound ("barkeep/pain")
PROP_ActiveSound ("barkeep/active")
PROP_Tag ("Bar_Keep")
END_DEFAULTS
// Armorer ------------------------------------------------------------------
class AArmorer : public AMerchant
{
DECLARE_STATELESS_ACTOR (AArmorer, AMerchant)
};
IMPLEMENT_STATELESS_ACTOR (AArmorer, Strife, 73, 0)
PROP_Translation (TRANSLATION_Standard, 5)
PROP_StrifeType (4)
PROP_StrifeTeaserType (4)
PROP_StrifeTeaserType2 (4)
PROP_PainSound ("armorer/pain")
PROP_Tag ("Aromorer")
END_DEFAULTS
// Medic --------------------------------------------------------------------
class AMedic : public AMerchant
{
DECLARE_STATELESS_ACTOR (AMedic, AMerchant)
};
IMPLEMENT_STATELESS_ACTOR (AMedic, Strife, 74, 0)
PROP_Translation (TRANSLATION_Standard, 6)
PROP_StrifeType (5)
PROP_StrifeTeaserType (5)
PROP_StrifeTeaserType2 (5)
PROP_PainSound ("medic/pain")
PROP_Tag ("Medic")
END_DEFAULTS
//============================================================================
//
// A_AlertOthers
//
// [RH] Split from A_CloseUpShop so that when merchants go into their pain
// state, the very first thing they do is send out an alert, which should
// prevent perpetual store closure. If we wait until A_CloseUpShop to do this,
// it is possible to set up a chain reaction where one merchant sends out the
// alert after another has already cleared their alert, causing that merchant
// to go back on the alert and send out their own alert 9 tics later.
//
//============================================================================
void A_AlertOthers (AActor *self)
{
if (self->target != NULL && self->target->player != NULL)
{
P_NoiseAlert (self->target, self);
}
}
//============================================================================
//
// A_CloseUpShop
//
//============================================================================
void A_CloseUpShop (AActor *self)
{
EV_DoDoor (DDoor::doorCloseWaitOpen, NULL, self, 999, 8*FRACUNIT, 120*TICRATE, 0, 0);
}
//============================================================================
//
// A_ClearSoundTarget
//
//============================================================================
void A_ClearSoundTarget (AActor *self)
{
AActor *actor;
self->Sector->SoundTarget = NULL;
for (actor = self->Sector->thinglist; actor != NULL; actor = actor->snext)
{
actor->LastHeard = NULL;
}
}
//============================================================================
//
// A_PlayActiveSound
//
//============================================================================
void A_PlayActiveSound (AActor *self)
{
S_SoundID (self, CHAN_VOICE, self->ActiveSound, 1, ATTN_NORM);
}

View file

@ -1,427 +0,0 @@
#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "a_strifeglobal.h"
static FRandom pr_peasatk ("PeasantAttack");
void A_PeasantAttack (AActor *);
void A_TossGib (AActor *);
void A_GetHurt (AActor *);
// Peasant Base Class -------------------------------------------------------
class APeasant : public AStrifeHumanoid
{
DECLARE_ACTOR (APeasant, AStrifeHumanoid)
};
FState APeasant::States[] =
{
#define S_PEASANT_STND 0
S_NORMAL (PEAS, 'A', 10, A_Look2, &States[S_PEASANT_STND]),
#define S_PEASANT_RUN (S_PEASANT_STND+1)
S_NORMAL (PEAS, 'A', 5, A_Wander, &States[S_PEASANT_RUN+1]),
S_NORMAL (PEAS, 'A', 5, A_Wander, &States[S_PEASANT_RUN+2]),
S_NORMAL (PEAS, 'B', 5, A_Wander, &States[S_PEASANT_RUN+3]),
S_NORMAL (PEAS, 'B', 5, A_Wander, &States[S_PEASANT_RUN+4]),
S_NORMAL (PEAS, 'C', 5, A_Wander, &States[S_PEASANT_RUN+5]),
S_NORMAL (PEAS, 'C', 5, A_Wander, &States[S_PEASANT_RUN+6]),
S_NORMAL (PEAS, 'D', 5, A_Wander, &States[S_PEASANT_RUN+7]),
S_NORMAL (PEAS, 'D', 5, A_Wander, &States[S_PEASANT_STND]),
#define S_PEASANT_MELEE (S_PEASANT_RUN+8)
S_NORMAL (PEAS, 'E', 10, A_FaceTarget, &States[S_PEASANT_MELEE+1]),
S_NORMAL (PEAS, 'F', 8, A_PeasantAttack, &States[S_PEASANT_MELEE+2]),
S_NORMAL (PEAS, 'E', 8, NULL, &States[S_PEASANT_RUN]),
#define S_PEASANT_PAIN (S_PEASANT_MELEE+3)
S_NORMAL (PEAS, 'O', 3, NULL, &States[S_PEASANT_PAIN+1]),
S_NORMAL (PEAS, 'O', 3, A_Pain, &States[S_PEASANT_MELEE]),
#define S_PEASANT_WOUNDED (S_PEASANT_PAIN+2)
S_NORMAL (PEAS, 'G', 5, NULL, &States[S_PEASANT_WOUNDED+1]),
S_NORMAL (PEAS, 'H', 10, A_GetHurt, &States[S_PEASANT_WOUNDED+2]),
S_NORMAL (PEAS, 'I', 6, NULL, &States[S_PEASANT_WOUNDED+1]),
#define S_PEASANT_DIE (S_PEASANT_WOUNDED+3)
S_NORMAL (PEAS, 'G', 5, NULL, &States[S_PEASANT_DIE+1]),
S_NORMAL (PEAS, 'H', 5, A_Scream, &States[S_PEASANT_DIE+2]),
S_NORMAL (PEAS, 'I', 6, NULL, &States[S_PEASANT_DIE+3]),
S_NORMAL (PEAS, 'J', 5, A_NoBlocking, &States[S_PEASANT_DIE+4]),
S_NORMAL (PEAS, 'K', 5, NULL, &States[S_PEASANT_DIE+5]),
S_NORMAL (PEAS, 'L', 6, NULL, &States[S_PEASANT_DIE+6]),
S_NORMAL (PEAS, 'M', 8, NULL, &States[S_PEASANT_DIE+7]),
S_NORMAL (PEAS, 'N', 1400, NULL, &States[S_PEASANT_DIE+8]),
S_NORMAL (GIBS, 'U', 5, NULL, &States[S_PEASANT_DIE+9]),
S_NORMAL (GIBS, 'V', 1400, NULL, NULL),
#define S_PEASANT_XDIE (S_PEASANT_DIE+10)
S_NORMAL (GIBS, 'M', 5, A_TossGib, &States[S_PEASANT_XDIE+1]),
S_NORMAL (GIBS, 'N', 5, A_XScream, &States[S_PEASANT_XDIE+2]),
S_NORMAL (GIBS, 'O', 5, A_NoBlocking, &States[S_PEASANT_XDIE+3]),
S_NORMAL (GIBS, 'P', 4, A_TossGib, &States[S_PEASANT_XDIE+4]),
S_NORMAL (GIBS, 'Q', 4, A_TossGib, &States[S_PEASANT_XDIE+5]),
S_NORMAL (GIBS, 'R', 4, A_TossGib, &States[S_PEASANT_XDIE+6]),
S_NORMAL (GIBS, 'S', 4, A_TossGib, &States[S_PEASANT_DIE+8])
};
IMPLEMENT_ACTOR (APeasant, Strife, -1, 0)
PROP_SpawnState (S_PEASANT_STND)
PROP_SeeState (S_PEASANT_RUN)
PROP_PainState (S_PEASANT_PAIN)
PROP_MeleeState (S_PEASANT_MELEE)
PROP_WoundState (S_PEASANT_WOUNDED)
PROP_DeathState (S_PEASANT_DIE)
PROP_XDeathState (S_PEASANT_XDIE)
PROP_SpawnHealth (31)
PROP_PainChance (200)
PROP_SpeedFixed (8)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_Flags (MF_SOLID|MF_SHOOTABLE|MF_JUSTHIT|MF_FRIENDLY)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_Flags3 (MF3_ISMONSTER)
PROP_Flags4 (MF4_NOSPLASHALERT)
PROP_MinMissileChance (150)
PROP_SeeSound ("peasant/sight")
PROP_AttackSound ("peasant/attack")
PROP_PainSound ("peasant/pain")
PROP_DeathSound ("peasant/death")
END_DEFAULTS
// Peasant Variant 1 --------------------------------------------------------
class APeasant1 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant1, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant1, Strife, 3004, 0)
PROP_StrifeType (6)
PROP_StrifeTeaserType (6)
PROP_StrifeTeaserType2 (6)
PROP_SpeedFixed (4)
END_DEFAULTS
// Peasant Variant 2 --------------------------------------------------------
class APeasant2 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant2, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant2, Strife, 130, 0)
PROP_StrifeType (7)
PROP_StrifeTeaserType (7)
PROP_StrifeTeaserType2 (7)
PROP_SpeedFixed (5)
END_DEFAULTS
// Peasant Variant 3 --------------------------------------------------------
class APeasant3 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant3, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant3, Strife, 131, 0)
PROP_StrifeType (8)
PROP_StrifeTeaserType (8)
PROP_StrifeTeaserType2 (8)
PROP_SpeedFixed (5)
END_DEFAULTS
// Peasant Variant 4 --------------------------------------------------------
class APeasant4 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant4, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant4, Strife, 65, 0)
PROP_Translation (TRANSLATION_Standard,0)
PROP_StrifeType (9)
PROP_StrifeTeaserType (9)
PROP_StrifeTeaserType2 (9)
PROP_SpeedFixed (7)
END_DEFAULTS
// Peasant Variant 5 --------------------------------------------------------
class APeasant5 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant5, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant5, Strife, 132, 0)
PROP_Translation (TRANSLATION_Standard,0)
PROP_StrifeType (10)
PROP_StrifeTeaserType (10)
PROP_StrifeTeaserType2 (10)
PROP_SpeedFixed (7)
END_DEFAULTS
// Peasant Variant 6 --------------------------------------------------------
class APeasant6 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant6, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant6, Strife, 133, 0)
PROP_Translation (TRANSLATION_Standard,0)
PROP_StrifeType (11)
PROP_StrifeTeaserType (11)
PROP_StrifeTeaserType2 (11)
PROP_SpeedFixed (7)
END_DEFAULTS
// Peasant Variant 7 --------------------------------------------------------
class APeasant7 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant7, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant7, Strife, 66, 0)
PROP_Translation (TRANSLATION_Standard,2)
PROP_StrifeType (12)
PROP_StrifeTeaserType (12)
PROP_StrifeTeaserType2 (12)
END_DEFAULTS
// Peasant Variant 8 --------------------------------------------------------
class APeasant8 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant8, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant8, Strife, 134, 0)
PROP_Translation (TRANSLATION_Standard,2)
PROP_StrifeType (13)
PROP_StrifeTeaserType (13)
PROP_StrifeTeaserType2 (13)
END_DEFAULTS
// Peasant Variant 9 --------------------------------------------------------
class APeasant9 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant9, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant9, Strife, 135, 0)
PROP_Translation (TRANSLATION_Standard,2)
PROP_StrifeType (14)
PROP_StrifeTeaserType (14)
PROP_StrifeTeaserType2 (14)
END_DEFAULTS
// Peasant Variant 10 --------------------------------------------------------
class APeasant10 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant10, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant10, Strife, 67, 0)
PROP_Translation (TRANSLATION_Standard,1)
PROP_StrifeType (15)
PROP_StrifeTeaserType (15)
PROP_StrifeTeaserType2 (15)
END_DEFAULTS
// Peasant Variant 11 --------------------------------------------------------
class APeasant11 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant11, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant11, Strife, 136, 0)
PROP_Translation (TRANSLATION_Standard,1)
PROP_StrifeType (16)
PROP_StrifeTeaserType (16)
PROP_StrifeTeaserType2 (16)
PROP_SpeedFixed (7)
END_DEFAULTS
// Peasant Variant 12 --------------------------------------------------------
class APeasant12 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant12, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant12, Strife, 137, 0)
PROP_Translation (TRANSLATION_Standard,1)
PROP_StrifeType (17)
PROP_StrifeTeaserType (17)
PROP_StrifeTeaserType2 (17)
END_DEFAULTS
// Peasant Variant 13 --------------------------------------------------------
class APeasant13 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant13, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant13, Strife, 172, 0)
PROP_Translation (TRANSLATION_Standard,3)
PROP_StrifeType (18)
PROP_StrifeTeaserType (18)
PROP_StrifeTeaserType2 (18)
END_DEFAULTS
// Peasant Variant 14 --------------------------------------------------------
class APeasant14 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant14, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant14, Strife, 173, 0)
PROP_Translation (TRANSLATION_Standard,3)
PROP_StrifeType (19)
PROP_StrifeTeaserType (19)
PROP_StrifeTeaserType2 (19)
END_DEFAULTS
// Peasant Variant 15 --------------------------------------------------------
class APeasant15 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant15, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant15, Strife, 174, 0)
PROP_Translation (TRANSLATION_Standard,3)
PROP_StrifeType (20)
PROP_StrifeTeaserType (20)
PROP_StrifeTeaserType2 (20)
END_DEFAULTS
// Peasant Variant 16 --------------------------------------------------------
class APeasant16 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant16, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant16, Strife, 175, 0)
PROP_Translation (TRANSLATION_Standard,5)
PROP_StrifeType (21)
PROP_StrifeTeaserType (21)
PROP_StrifeTeaserType2 (21)
END_DEFAULTS
// Peasant Variant 17 --------------------------------------------------------
class APeasant17 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant17, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant17, Strife, 176, 0)
PROP_Translation (TRANSLATION_Standard,5)
PROP_StrifeType (22)
PROP_StrifeTeaserType (22)
PROP_StrifeTeaserType2 (22)
END_DEFAULTS
// Peasant Variant 18 --------------------------------------------------------
class APeasant18 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant18, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant18, Strife, 177, 0)
PROP_Translation (TRANSLATION_Standard,5)
PROP_StrifeType (23)
PROP_StrifeTeaserType (23)
PROP_StrifeTeaserType2 (23)
END_DEFAULTS
// Peasant Variant 19 --------------------------------------------------------
class APeasant19 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant19, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant19, Strife, 178, 0)
PROP_Translation (TRANSLATION_Standard,4)
PROP_StrifeType (24)
PROP_StrifeTeaserType (24)
PROP_StrifeTeaserType2 (24)
END_DEFAULTS
// Peasant Variant 20 --------------------------------------------------------
class APeasant20 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant20, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant20, Strife, 179, 0)
PROP_Translation (TRANSLATION_Standard,4)
PROP_StrifeType (25)
PROP_StrifeTeaserType (25)
PROP_StrifeTeaserType2 (25)
END_DEFAULTS
// Peasant Variant 21 --------------------------------------------------------
class APeasant21 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant21, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant21, Strife, 180, 0)
PROP_Translation (TRANSLATION_Standard,4)
PROP_StrifeType (26)
PROP_StrifeTeaserType (26)
PROP_StrifeTeaserType2 (26)
END_DEFAULTS
// Peasant Variant 22 --------------------------------------------------------
class APeasant22 : public APeasant
{
DECLARE_STATELESS_ACTOR (APeasant22, APeasant)
};
IMPLEMENT_STATELESS_ACTOR (APeasant22, Strife, 181, 0)
PROP_Translation (TRANSLATION_Standard,6)
PROP_StrifeType (27)
PROP_StrifeTeaserType (27)
PROP_StrifeTeaserType2 (27)
END_DEFAULTS
//============================================================================
//
// A_PeasantAttack
//
//============================================================================
void A_PeasantAttack (AActor *self)
{
if (self->target == NULL)
return;
A_FaceTarget (self);
if (self->CheckMeleeRange ())
{
P_DamageMobj (self->target, self, self, (pr_peasatk() % 5) * 2 + 2, MOD_HIT);
}
}

View file

@ -1,449 +0,0 @@
/*
* Quest Item Usage:
*
* 1 You got Beldin's ring
* 2 You got the Chalice
* 3 You got 300 gold, so it's time to visit Irale and the governor
* 4 Accepted the governor's power coupling mission
* 5 Accepted the governor's mission to kill Derwin
* 6 You broke the Front's power coupling
* 7 You took out the scanning team
* 8 You got the broken power coupling
* 9 You got the ear
* 10 You got the prison pass
* 11 You got the prison key
* 12 You got the severed hand
* 13 You've freed the prisoners!
* 14 You've Blown Up the Crystal
* 15 You got the guard uniform
* 16 You've Blown Up the Gates (/Piston)
* 17 You watched the Sigil slideshow on map10
* 18 You got the Oracle pass
* 19 You met Quincy and talked to him about the Bishop
* 20
* 21 You Killed the Bishop!
* 22 The Oracle has told you to kill Macil
* 23 You've Killed The Oracle!
* 24 You Killed Macil!
* 25 You've destroyed the Converter!
* 26 You've Killed The Loremaster!
* 27 You've Blown Up the Computer
* 28 You got the catacomb key
* 29 You destroyed the mind control device in the mines
* 30
* 31
*/
#include "a_pickups.h"
#include "a_strifeglobal.h"
FState AQuestItem::States[] =
{
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AQuestItem, Strife, -1, 0)
PROP_SpawnState (0)
END_DEFAULTS
// Quest Item 1 -------------------------------------------------------------
class AQuestItem1 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem1, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem1, Strife, -1, 0)
PROP_StrifeType (312)
PROP_StrifeTeaserType (293)
PROP_StrifeTeaserType2 (310)
END_DEFAULTS
// Quest Item 2 -------------------------------------------------------------
class AQuestItem2 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem2, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem2, Strife, -1, 0)
PROP_StrifeType (313)
PROP_StrifeTeaserType (294)
PROP_StrifeTeaserType2 (311)
// "Blown_Up_the_Crystal" in the Teaser
END_DEFAULTS
// Quest Item 3 -------------------------------------------------------------
class AQuestItem3 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem3, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem3, Strife, -1, 0)
PROP_StrifeType (314)
PROP_StrifeTeaserType (295)
PROP_StrifeTeaserType2 (312)
// "Blown_Up_the_Gates" in the Teaser
END_DEFAULTS
// Quest Item 4 -------------------------------------------------------------
class AQuestItem4 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem4, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem4, Strife, -1, 0)
PROP_StrifeType (315)
PROP_StrifeTeaserType (296)
PROP_StrifeTeaserType2 (313)
PROP_Tag ("quest4")
END_DEFAULTS
// Quest Item 5 -------------------------------------------------------------
class AQuestItem5 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem5, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem5, Strife, -1, 0)
PROP_StrifeType (316)
PROP_StrifeTeaserType (297)
PROP_StrifeTeaserType2 (314)
PROP_Tag ("quest5")
END_DEFAULTS
// Quest Item 6 -------------------------------------------------------------
class AQuestItem6 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem6, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem6, Strife, -1, 0)
PROP_StrifeType (317)
PROP_StrifeTeaserType (298)
PROP_StrifeTeaserType2 (315)
PROP_Tag ("quest6")
END_DEFAULTS
// Quest Item 7 -------------------------------------------------------------
class AQuestItem7 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem7, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem7, Strife, -1, 0)
PROP_StrifeType (318)
END_DEFAULTS
// Quest Item 8 -------------------------------------------------------------
class AQuestItem8 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem8, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem8, Strife, -1, 0)
PROP_StrifeType (319)
END_DEFAULTS
// Quest Item 9 -------------------------------------------------------------
class AQuestItem9 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem9, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem9, Strife, -1, 0)
PROP_StrifeType (320)
END_DEFAULTS
// Quest Item 10 ------------------------------------------------------------
class AQuestItem10 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem10, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem10, Strife, -1, 0)
PROP_StrifeType (321)
END_DEFAULTS
// Quest Item 11 ------------------------------------------------------------
class AQuestItem11 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem11, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem11, Strife, -1, 0)
PROP_StrifeType (322)
END_DEFAULTS
// Quest Item 12 ------------------------------------------------------------
class AQuestItem12 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem12, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem12, Strife, -1, 0)
PROP_StrifeType (323)
END_DEFAULTS
// Quest Item 13 ------------------------------------------------------------
class AQuestItem13 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem13, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem13, Strife, -1, 0)
PROP_StrifeType (324)
END_DEFAULTS
// Quest Item 14 ------------------------------------------------------------
class AQuestItem14 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem14, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem14, Strife, -1, 0)
PROP_StrifeType (325)
PROP_Tag ("You've_Blown_Up_the_Crystal")
END_DEFAULTS
// Quest Item 15 ------------------------------------------------------------
class AQuestItem15 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem15, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem15, Strife, -1, 0)
PROP_StrifeType (326)
END_DEFAULTS
// Quest Item 16 ------------------------------------------------------------
class AQuestItem16 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem16, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem16, Strife, -1, 0)
PROP_StrifeType (327)
PROP_Tag ("You've_Blown_Up_the_Gates")
END_DEFAULTS
// Quest Item 17 ------------------------------------------------------------
class AQuestItem17 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem17, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem17, Strife, -1, 0)
PROP_StrifeType (328)
END_DEFAULTS
// Quest Item 18 ------------------------------------------------------------
class AQuestItem18 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem18, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem18, Strife, -1, 0)
PROP_StrifeType (329)
END_DEFAULTS
// Quest Item 19 ------------------------------------------------------------
class AQuestItem19 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem19, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem19, Strife, -1, 0)
PROP_StrifeType (330)
END_DEFAULTS
// Quest Item 20 ------------------------------------------------------------
class AQuestItem20 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem20, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem20, Strife, -1, 0)
PROP_StrifeType (331)
END_DEFAULTS
// Quest Item 21 ------------------------------------------------------------
class AQuestItem21 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem21, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem21, Strife, -1, 0)
PROP_StrifeType (332)
PROP_Tag ("You_Killed_the_Bishop!")
END_DEFAULTS
// Quest Item 22 ------------------------------------------------------------
class AQuestItem22 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem22, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem22, Strife, -1, 0)
PROP_StrifeType (333)
END_DEFAULTS
// Quest Item 23 ------------------------------------------------------------
class AQuestItem23 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem23, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem23, Strife, -1, 0)
PROP_StrifeType (334)
PROP_Tag ("You've_Killed_The_Oracle!")
END_DEFAULTS
// Quest Item 24 ------------------------------------------------------------
class AQuestItem24 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem24, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem24, Strife, -1, 0)
PROP_StrifeType (335)
PROP_Tag ("You_Killed_Macil!")
END_DEFAULTS
// Quest Item 25 ------------------------------------------------------------
class AQuestItem25 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem25, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem25, Strife, -1, 0)
PROP_StrifeType (336)
END_DEFAULTS
// Quest Item 26 ------------------------------------------------------------
class AQuestItem26 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem26, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem26, Strife, -1, 0)
PROP_StrifeType (337)
PROP_Tag ("You've_Killed_The_Loremaster!")
END_DEFAULTS
// Quest Item 27 ------------------------------------------------------------
class AQuestItem27 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem27, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem27, Strife, -1, 0)
PROP_StrifeType (338)
PROP_Tag ("You've_Blown_Up_the_Computer")
END_DEFAULTS
// Quest Item 28 ------------------------------------------------------------
class AQuestItem28 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem28, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem28, Strife, -1, 0)
PROP_StrifeType (339)
END_DEFAULTS
// Quest Item 29 ------------------------------------------------------------
class AQuestItem29 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem29, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem29, Strife, -1, 0)
PROP_StrifeType (340)
END_DEFAULTS
// Quest Item 30 ------------------------------------------------------------
class AQuestItem30 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem30, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem30, Strife, -1, 0)
PROP_StrifeType (341)
END_DEFAULTS
// Quest Item 31 ------------------------------------------------------------
class AQuestItem31 : public AQuestItem
{
DECLARE_STATELESS_ACTOR (AQuestItem31, AQuestItem)
};
IMPLEMENT_STATELESS_ACTOR (AQuestItem31, Strife, -1, 0)
PROP_StrifeType (342)
END_DEFAULTS
// Quest Item Class Pointers ------------------------------------------------
const TypeInfo *QuestItemClasses[31] =
{
RUNTIME_CLASS(AQuestItem1),
RUNTIME_CLASS(AQuestItem2),
RUNTIME_CLASS(AQuestItem3),
RUNTIME_CLASS(AQuestItem4),
RUNTIME_CLASS(AQuestItem5),
RUNTIME_CLASS(AQuestItem6),
RUNTIME_CLASS(AQuestItem7),
RUNTIME_CLASS(AQuestItem8),
RUNTIME_CLASS(AQuestItem9),
RUNTIME_CLASS(AQuestItem10),
RUNTIME_CLASS(AQuestItem11),
RUNTIME_CLASS(AQuestItem12),
RUNTIME_CLASS(AQuestItem13),
RUNTIME_CLASS(AQuestItem14),
RUNTIME_CLASS(AQuestItem15),
RUNTIME_CLASS(AQuestItem16),
RUNTIME_CLASS(AQuestItem17),
RUNTIME_CLASS(AQuestItem18),
RUNTIME_CLASS(AQuestItem19),
RUNTIME_CLASS(AQuestItem20),
RUNTIME_CLASS(AQuestItem21),
RUNTIME_CLASS(AQuestItem22),
RUNTIME_CLASS(AQuestItem23),
RUNTIME_CLASS(AQuestItem24),
RUNTIME_CLASS(AQuestItem25),
RUNTIME_CLASS(AQuestItem26),
RUNTIME_CLASS(AQuestItem27),
RUNTIME_CLASS(AQuestItem28),
RUNTIME_CLASS(AQuestItem29),
RUNTIME_CLASS(AQuestItem30),
RUNTIME_CLASS(AQuestItem31)
};

View file

@ -1,53 +0,0 @@
#include "actor.h"
#include "p_enemy.h"
// Rat Buddy ----------------------------------------------------------------
class ARatBuddy : public AActor
{
DECLARE_ACTOR (ARatBuddy, AActor)
};
FState ARatBuddy::States[] =
{
#define S_RAT_STAND 0
S_NORMAL (RATT, 'A', 10, A_Look, &States[S_RAT_STAND]),
#define S_RAT_CHASE (S_RAT_STAND+1)
S_NORMAL (RATT, 'A', 4, A_Chase, &States[S_RAT_CHASE+1]),
S_NORMAL (RATT, 'A', 4, A_Chase, &States[S_RAT_CHASE+2]),
S_NORMAL (RATT, 'B', 4, A_Chase, &States[S_RAT_CHASE+3]),
S_NORMAL (RATT, 'B', 4, A_Chase, &States[S_RAT_CHASE]),
#define S_RAT_WANDER (S_RAT_CHASE+4)
S_NORMAL (RATT, 'A', 8, A_Wander, &States[S_RAT_WANDER+1]),
S_NORMAL (RATT, 'B', 4, A_Wander, &States[S_RAT_CHASE]),
#define S_RAT_DIE (S_RAT_WANDER+2)
S_NORMAL (MEAT, 'Q', 700, NULL, NULL)
};
IMPLEMENT_ACTOR (ARatBuddy, Strife, 85, 0)
PROP_StrifeType (202)
PROP_StrifeTeaserType (196)
PROP_StrifeTeaserType2 (200)
PROP_SpawnHealth (5)
PROP_SpawnState (S_RAT_STAND)
PROP_SeeState (S_RAT_CHASE)
PROP_MeleeState (S_RAT_WANDER)
PROP_DeathState (S_RAT_DIE)
PROP_SpeedFixed (13)
PROP_RadiusFixed (10)
PROP_HeightFixed (16)
PROP_Flags (MF_NOBLOOD)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ)
PROP_Flags3 (MF3_ISMONSTER)
PROP_Flags4 (MF4_INCOMBAT)
PROP_MinMissileChance (150)
PROP_MaxStepHeight (16)
PROP_MaxDropOffHeight (32)
PROP_Tag ("rat_buddy")
PROP_SeeSound ("rat/sight")
PROP_DeathSound ("rat/death")
PROP_ActiveSound ("rat/active")
END_DEFAULTS

View file

@ -1,69 +0,0 @@
#include "a_pickups.h"
// Metal Armor --------------------------------------------------------------
class AMetalArmor : public ABasicArmorPickup
{
DECLARE_ACTOR (AMetalArmor, ABasicArmorPickup)
public:
virtual const char *PickupMessage ()
{
return "You picked up the Metal Armor.";
}
};
FState AMetalArmor::States[] =
{
S_NORMAL (ARM3, 'A', -1, NULL, NULL),
};
IMPLEMENT_ACTOR (AMetalArmor, Strife, 2019, 69)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_SpawnState (0)
PROP_Inventory_MaxAmount (3)
PROP_Inventory_FlagsSet (IF_AUTOACTIVATE|IF_INVBAR)
PROP_StrifeType (129)
PROP_StrifeTeaserType (125)
PROP_StrifeTeaserType2 (128)
PROP_BasicArmorPickup_SaveAmount (200)
PROP_BasicArmorPickup_SavePercent (FRACUNIT/2)
PROP_Inventory_Icon ("I_ARM1")
PROP_Tag ("Metal_Armor")
END_DEFAULTS
// Leather Armor ------------------------------------------------------------
class ALeatherArmor : public ABasicArmorPickup
{
DECLARE_ACTOR (ALeatherArmor, ABasicArmorPickup)
public:
virtual const char *PickupMessage ()
{
return "You picked up the Leather Armor.";
}
};
FState ALeatherArmor::States[] =
{
S_NORMAL (ARM4, 'A', -1, NULL, NULL),
};
IMPLEMENT_ACTOR (ALeatherArmor, Strife, 2018, 68)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_SpawnState (0)
PROP_Inventory_MaxAmount (5)
PROP_Inventory_FlagsSet (IF_AUTOACTIVATE|IF_INVBAR)
PROP_StrifeType (130)
PROP_StrifeTeaserType (126)
PROP_StrifeTeaserType2 (129)
PROP_BasicArmorPickup_SaveAmount (100)
PROP_BasicArmorPickup_SavePercent (FRACUNIT/3)
PROP_Inventory_Icon ("I_ARM2")
PROP_Tag ("Leather_Armor")
END_DEFAULTS

View file

@ -55,11 +55,6 @@ public:
AInventory *CreateCopy (AActor *other); AInventory *CreateCopy (AActor *other);
}; };
class AQuestItem : public AInventory
{
DECLARE_ACTOR (AQuestItem, AInventory)
};
class AOracle : public AActor class AOracle : public AActor
{ {
DECLARE_ACTOR (AOracle, AActor) DECLARE_ACTOR (AOracle, AActor)

View file

@ -10,136 +10,7 @@
#include "s_sound.h" #include "s_sound.h"
#include "a_strifeweaps.h" #include "a_strifeweaps.h"
#include "d_event.h" #include "d_event.h"
#include "a_keys.h"
// Med patch -----------------------------------------------------------------
class AMedPatch : public AHealthPickup
{
DECLARE_ACTOR (AMedPatch, AHealthPickup);
protected:
const char *PickupMessage ();
};
FState AMedPatch::States[] =
{
S_NORMAL (STMP, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMedPatch, Strife, 2011, 0)
PROP_SpawnHealth (10)
PROP_SpawnState (0)
PROP_StrifeType (125)
PROP_StrifeTeaserType (121)
PROP_StrifeTeaserType2 (124)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_MaxAmount (20)
PROP_Tag ("Med_patch")
PROP_Inventory_Icon ("I_STMP")
END_DEFAULTS
const char *AMedPatch::PickupMessage ()
{
return "You picked up the Med patch.";
}
// Medical Kit ---------------------------------------------------------------
class AMedicalKit : public AHealthPickup
{
DECLARE_ACTOR (AMedicalKit, AHealthPickup);
protected:
const char *PickupMessage ();
};
FState AMedicalKit::States[] =
{
S_NORMAL (MDKT, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMedicalKit, Strife, 2012, 0)
PROP_SpawnHealth (25)
PROP_SpawnState (0)
PROP_StrifeType (126)
PROP_StrifeTeaserType (122)
PROP_StrifeTeaserType2 (125)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_MaxAmount (15)
PROP_Tag ("Medical_kit")
PROP_Inventory_Icon ("I_MDKT")
END_DEFAULTS
const char *AMedicalKit::PickupMessage ()
{
return "You picked up the Medical kit.";
}
// Surgery Kit --------------------------------------------------------------
class ASurgeryKit : public AHealthPickup
{
DECLARE_ACTOR (ASurgeryKit, AHealthPickup);
protected:
const char *PickupMessage ();
bool Use (bool pickup);
};
FState ASurgeryKit::States[] =
{
S_NORMAL (FULL, 'A', 35, NULL, &States[1]),
S_NORMAL (FULL, 'B', 35, NULL, &States[0])
};
IMPLEMENT_ACTOR (ASurgeryKit, Strife, 83, 0)
PROP_SpawnState (0)
PROP_StrifeType (127)
PROP_StrifeTeaserType (123)
PROP_StrifeTeaserType2 (126)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_MaxAmount (5)
PROP_Tag ("Surgery_Kit") // "full_health" in the Teaser
PROP_Inventory_Icon ("I_FULL")
END_DEFAULTS
const char *ASurgeryKit::PickupMessage ()
{
return "You picked up the Surgery Kit.";
}
bool ASurgeryKit::Use (bool pickup)
{
return P_GiveBody (Owner, -100);
}
// StrifeMap ----------------------------------------------------------------
class AStrifeMap : public AMapRevealer
{
DECLARE_ACTOR (AStrifeMap, AMapRevealer)
protected:
virtual const char *PickupMessage ()
{
return "You picked up the map";
}
};
FState AStrifeMap::States[] =
{
S_BRIGHT (SMAP, 'A', 6, NULL , &States[1]),
S_BRIGHT (SMAP, 'B', 6, NULL , &States[0]),
};
IMPLEMENT_ACTOR (AStrifeMap, Strife, 2026, 137)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_SpawnState (0)
PROP_StrifeType (164)
PROP_StrifeTeaserType (160)
PROP_StrifeTeaserType2 (163)
PROP_Inventory_PickupSound ("misc/p_pkup")
END_DEFAULTS
// Degnin Ore --------------------------------------------------------------- // Degnin Ore ---------------------------------------------------------------
@ -235,357 +106,6 @@ bool ADegninOre::Use (bool pickup)
} }
} }
// Beldin's Ring ------------------------------------------------------------
class ABeldinsRing : public AInventory
{
DECLARE_ACTOR (ABeldinsRing, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState ABeldinsRing::States[] =
{
S_NORMAL (RING, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ABeldinsRing, Strife, -1, 0)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_StrifeType (173)
PROP_StrifeTeaserType (165)
PROP_StrifeTeaserType2 (169)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("ring")
PROP_Inventory_Icon ("I_RING")
END_DEFAULTS
bool ABeldinsRing::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[0]);
return true;
}
return false;
}
const char *ABeldinsRing::PickupMessage ()
{
return "You picked up the ring.";
}
// Offering Chalice ---------------------------------------------------------
class AOfferingChalice : public AInventory
{
DECLARE_ACTOR (AOfferingChalice, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState AOfferingChalice::States[] =
{
S_BRIGHT (RELC, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AOfferingChalice, Strife, 205, 0)
PROP_StrifeType (174)
PROP_StrifeTeaserType (166)
PROP_StrifeTeaserType2 (170)
PROP_SpawnState (0)
PROP_RadiusFixed (10)
PROP_HeightFixed (16)
PROP_Flags (MF_SPECIAL|MF_DROPPED)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("Offering_Chalice")
PROP_Inventory_Icon ("I_RELC")
END_DEFAULTS
bool AOfferingChalice::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[1]);
return true;
}
return false;
}
const char *AOfferingChalice::PickupMessage ()
{
return "You picked up the Offering Chalice.";
}
// Ear ----------------------------------------------------------------------
class AEar : public AInventory
{
DECLARE_ACTOR (AEar, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState AEar::States[] =
{
S_NORMAL (EARS, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AEar, Strife, -1, 0)
PROP_StrifeType (175)
PROP_StrifeTeaserType (167)
PROP_StrifeTeaserType2 (171)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("ear")
PROP_Inventory_Icon ("I_EARS")
END_DEFAULTS
bool AEar::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[8]);
return true;
}
return false;
}
const char *AEar::PickupMessage ()
{
return "You picked up the ear.";
}
// Broken Power Coupling ----------------------------------------------------
class ABrokenPowerCoupling : public AInventory
{
DECLARE_ACTOR (ABrokenPowerCoupling, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState ABrokenPowerCoupling::States[] =
{
S_NORMAL (COUP, 'C', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ABrokenPowerCoupling, Strife, 226, 0)
PROP_StrifeType (289)
PROP_SpawnHealth (40)
PROP_SpawnState (0)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_RadiusFixed (16)
PROP_HeightFixed (16)
PROP_Inventory_MaxAmount (1)
PROP_Flags (MF_SPECIAL|MF_DROPPED)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Tag ("BROKEN_POWER_COUPLING")
PROP_Inventory_Icon ("I_COUP")
END_DEFAULTS
bool ABrokenPowerCoupling::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[7]);
return true;
}
return false;
}
const char *ABrokenPowerCoupling::PickupMessage ()
{
return "You picked up the broken power coupling.";
}
// Shadow Armor -------------------------------------------------------------
void A_ClearShadow (AActor *);
void A_BeShadowyFoe (AActor *);
void A_SetShadow (AActor *);
class AShadowArmor : public APowerupGiver
{
DECLARE_ACTOR (AShadowArmor, APowerupGiver)
public:
const char *PickupMessage ();
};
FState AShadowArmor::States[] =
{
S_BRIGHT (SHD1, 'A', 17, A_ClearShadow, &States[1]),
S_BRIGHT (SHD1, 'A', 17, A_BeShadowyFoe, &States[2]),
S_BRIGHT (SHD1, 'A', 17, A_SetShadow, &States[3]),
S_BRIGHT (SHD1, 'A', 17, A_BeShadowyFoe, &States[0])
};
IMPLEMENT_ACTOR (AShadowArmor, Strife, 2024, 135)
PROP_StrifeType (160)
PROP_StrifeTeaserType (156)
PROP_StrifeTeaserType2 (159)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_SpawnState (0)
PROP_Inventory_MaxAmount (2)
PROP_Inventory_FlagsClear (IF_FANCYPICKUPSOUND)
PROP_PowerupGiver_Powerup ("PowerShadow")
PROP_Tag ("Shadow_armor")
PROP_Inventory_Icon ("I_SHD1")
PROP_Inventory_PickupSound ("misc/i_pkup")
END_DEFAULTS
const char *AShadowArmor::PickupMessage ()
{
return "You picked up the Shadow armor.";
}
// Environmental suit -------------------------------------------------------
class AEnvironmentalSuit : public APowerupGiver
{
DECLARE_ACTOR (AEnvironmentalSuit, APowerupGiver)
public:
const char *PickupMessage ();
};
FState AEnvironmentalSuit::States[] =
{
S_BRIGHT (MASK, 'A', -1, NULL , NULL)
};
IMPLEMENT_ACTOR (AEnvironmentalSuit, Strife, 2025, 136)
PROP_StrifeType (161)
PROP_StrifeTeaserType (157)
PROP_StrifeTeaserType2 (160)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_SpawnState (0)
PROP_Inventory_MaxAmount (5)
PROP_Inventory_FlagsClear (IF_FANCYPICKUPSOUND)
PROP_PowerupGiver_Powerup ("PowerMask")
PROP_Tag ("Environmental_Suit")
PROP_Inventory_Icon ("I_MASK")
PROP_Inventory_PickupSound ("misc/i_pkup")
END_DEFAULTS
const char *AEnvironmentalSuit::PickupMessage ()
{
return "You picked up the Environmental Suit.";
}
// Guard Uniform ------------------------------------------------------------
class AGuardUniform : public AInventory
{
DECLARE_ACTOR (AGuardUniform, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState AGuardUniform::States[] =
{
S_NORMAL (UNIF, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AGuardUniform, Strife, 90, 0)
PROP_StrifeType (162)
PROP_StrifeTeaserType (158)
PROP_StrifeTeaserType2 (161)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("Guard_Uniform")
PROP_Inventory_Icon ("I_UNIF")
END_DEFAULTS
bool AGuardUniform::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[14]);
return true;
}
return false;
}
const char *AGuardUniform::PickupMessage ()
{
return "You picked up the Guard Uniform.";
}
// Officer's Uniform --------------------------------------------------------
class AOfficersUniform : public AInventory
{
DECLARE_ACTOR (AOfficersUniform, AInventory)
public:
const char *PickupMessage ();
};
FState AOfficersUniform::States[] =
{
S_NORMAL (OFIC, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AOfficersUniform, Strife, 52, 0)
PROP_StrifeType (163)
PROP_StrifeTeaserType (159)
PROP_StrifeTeaserType2 (162)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("Officer's_Uniform")
PROP_Inventory_Icon ("I_OFIC")
END_DEFAULTS
const char *AOfficersUniform::PickupMessage ()
{
return "You picked up the Officer's Uniform.";
}
// InterrogatorReport -------------------------------------------------------
// SCRIPT32 in strife0.wad has an Acolyte that drops this, but I couldn't
// find that Acolyte in the map. It seems to be totally unused in the
// final game.
class AInterrogatorReport : public AInventory
{
DECLARE_ACTOR (AInterrogatorReport, AInventory)
public:
const char *PickupMessage ();
};
FState AInterrogatorReport::States[] =
{
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AInterrogatorReport, Strife, -1, 0)
PROP_StrifeType (308)
PROP_StrifeTeaserType (289)
PROP_StrifeTeaserType2 (306)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Tag ("report")
END_DEFAULTS
const char *AInterrogatorReport::PickupMessage ()
{
return "You picked up the report.";
}
// Gun Training ------------------------------------------------------------- // Gun Training -------------------------------------------------------------
class AGunTraining : public AInventory class AGunTraining : public AInventory
@ -653,71 +173,6 @@ bool AHealthTraining::TryPickup (AActor *toucher)
return false; return false;
} }
// Info ---------------------------------------------------------------------
class AInfo : public AInventory
{
DECLARE_ACTOR (AInfo, AInventory)
public:
const char *PickupMessage ();
};
FState AInfo::States[] =
{
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AInfo, Strife, -1, 0)
PROP_StrifeType (300)
PROP_StrifeTeaserType (282)
PROP_StrifeTeaserType2 (299)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_FlagsSet (IF_INVBAR)
PROP_Tag ("info")
PROP_Inventory_Icon ("I_TOKN")
END_DEFAULTS
const char *AInfo::PickupMessage ()
{
return "You picked up the info.";
}
// Targeter -----------------------------------------------------------------
class ATargeter : public APowerupGiver
{
DECLARE_ACTOR (ATargeter, APowerupGiver)
public:
const char *PickupMessage ();
};
FState ATargeter::States[] =
{
S_NORMAL (TARG, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ATargeter, Strife, 207, 0)
PROP_StrifeType (167)
PROP_StrifeTeaserType (169)
PROP_StrifeTeaserType2 (173)
PROP_SpawnState (0)
PROP_Flags (MF_SPECIAL)
PROP_Flags2 (MF2_FLOORCLIP)
PROP_Inventory_MaxAmount (5)
PROP_Inventory_FlagsClear (IF_FANCYPICKUPSOUND)
PROP_Tag ("Targeter")
PROP_Inventory_Icon ("I_TARG")
PROP_PowerupGiver_Powerup ("PowerTargeter")
PROP_Inventory_PickupSound ("misc/i_pkup")
END_DEFAULTS
const char *ATargeter::PickupMessage ()
{
return "You picked up the Targeter.";
}
// Scanner ------------------------------------------------------------------ // Scanner ------------------------------------------------------------------
class AScanner : public APowerupGiver class AScanner : public APowerupGiver
@ -765,6 +220,62 @@ bool AScanner::Use (bool pickup)
return Super::Use (pickup); return Super::Use (pickup);
} }
// Prison Pass --------------------------------------------------------------
class APrisonPass : public AKey
{
DECLARE_ACTOR (APrisonPass, AKey)
public:
bool TryPickup (AActor *toucher);
bool SpecialDropAction (AActor *dropper);
const char *PickupMessage ();
};
FState APrisonPass::States[] =
{
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APrisonPass, Strife, -1, 0)
PROP_StrifeType (304)
PROP_StrifeTeaserType (286)
PROP_StrifeTeaserType2 (303)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_TOKN")
PROP_Tag ("Prison_pass")
END_DEFAULTS
bool APrisonPass::TryPickup (AActor *toucher)
{
Super::TryPickup (toucher);
EV_DoDoor (DDoor::doorOpen, NULL, toucher, 223, 2*FRACUNIT, 0, 0, 0);
toucher->GiveInventoryType (QuestItemClasses[9]);
return true;
}
const char *APrisonPass::PickupMessage ()
{
return "You picked up the Prison pass.";
}
//============================================================================
//
// APrisonPass :: SpecialDropAction
//
// Trying to make a monster that drops a prison pass turns it into an
// OpenDoor223 item instead. That means the only way to get it in Strife
// is through dialog, which is why it doesn't have its own sprite.
//
//============================================================================
bool APrisonPass::SpecialDropAction (AActor *dropper)
{
EV_DoDoor (DDoor::doorOpen, NULL, dropper, 223, 2*FRACUNIT, 0, 0, 0);
Destroy ();
return true;
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Dummy items. They are just used by Strife to perform --------------------- // Dummy items. They are just used by Strife to perform ---------------------
// actions and cannot be held. ---------------------------------------------- // actions and cannot be held. ----------------------------------------------

View file

@ -1,895 +0,0 @@
#include "a_keys.h"
#include "a_strifeglobal.h"
#include "p_local.h"
IMPLEMENT_STATELESS_ACTOR (AStrifeKey, Strife, -1, 0)
PROP_RadiusFixed (20)
PROP_HeightFixed (16)
PROP_Flags (MF_SPECIAL|MF_NOTDMATCH)
PROP_Flags2 (MF2_FLOORCLIP)
END_DEFAULTS
// Base Key -----------------------------------------------------------------
class ABaseKey : public AStrifeKey
{
DECLARE_ACTOR (ABaseKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ABaseKey::States[] =
{
S_NORMAL (FUSL, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ABaseKey, Strife, 230, 0)
PROP_StrifeType (133)
PROP_StrifeTeaserType (129)
PROP_StrifeTeaserType2 (132)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_FUSL")
PROP_Tag ("Base_Key")
END_DEFAULTS
const char *ABaseKey::PickupMessage ()
{
return "You picked up the Base Key.";
}
// Govs Key -----------------------------------------------------------------
class AGovsKey : public AStrifeKey
{
DECLARE_ACTOR (AGovsKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AGovsKey::States[] =
{
S_NORMAL (REBL, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AGovsKey, Strife, -1, 0)
PROP_StrifeType (134)
PROP_StrifeTeaserType (130)
PROP_StrifeTeaserType2 (133)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_REBL")
PROP_Tag ("Govs_Key") // "Rebel_Key" in the Teaser
END_DEFAULTS
const char *AGovsKey::PickupMessage ()
{
return "You picked up the Govs Key.";
}
// Passcard -----------------------------------------------------------------
class APasscard : public AStrifeKey
{
DECLARE_ACTOR (APasscard, AStrifeKey)
public:
const char *PickupMessage ();
};
FState APasscard::States[] =
{
S_NORMAL (TPAS, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APasscard, Strife, 185, 0)
PROP_StrifeType (135)
PROP_StrifeTeaserType (131)
PROP_StrifeTeaserType2 (134)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_TPAS")
PROP_Tag ("Passcard")
END_DEFAULTS
const char *APasscard::PickupMessage ()
{
return "You picked up the Passcard.";
}
// ID Badge -----------------------------------------------------------------
class AIDBadge : public AStrifeKey
{
DECLARE_ACTOR (AIDBadge, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AIDBadge::States[] =
{
S_NORMAL (CRD1, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AIDBadge, Strife, 184, 0)
PROP_StrifeType (136)
PROP_StrifeTeaserType (132)
PROP_StrifeTeaserType2 (135)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_CRD1")
PROP_Tag ("ID_Badge")
END_DEFAULTS
const char *AIDBadge::PickupMessage ()
{
return "You picked up the ID Badge.";
}
// Prison Key ---------------------------------------------------------------
class APrisonKey : public AStrifeKey
{
DECLARE_ACTOR (APrisonKey, AStrifeKey)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState APrisonKey::States[] =
{
S_NORMAL (PRIS, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APrisonKey, Strife, -1, 0)
PROP_StrifeType (137)
PROP_StrifeTeaserType (133)
PROP_StrifeTeaserType2 (136)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_PRIS")
PROP_Tag ("Prison_Key")
END_DEFAULTS
bool APrisonKey::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[10]);
return true;
}
return false;
}
const char *APrisonKey::PickupMessage ()
{
return "You picked up the Prison Key.";
}
// Severed Hand -------------------------------------------------------------
class ASeveredHand : public AStrifeKey
{
DECLARE_ACTOR (ASeveredHand, AStrifeKey)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState ASeveredHand::States[] =
{
S_NORMAL (HAND, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ASeveredHand, Strife, 91, 0)
PROP_StrifeType (138)
PROP_StrifeTeaserType (134)
PROP_StrifeTeaserType2 (137)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_HAND")
PROP_Tag ("Severed_Hand")
END_DEFAULTS
bool ASeveredHand::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[11]);
return true;
}
return false;
}
const char *ASeveredHand::PickupMessage ()
{
return "You picked up the Severed Hand.";
}
// Power1 Key ---------------------------------------------------------------
class APower1Key : public AStrifeKey
{
DECLARE_ACTOR (APower1Key, AStrifeKey)
public:
const char *PickupMessage ();
};
FState APower1Key::States[] =
{
S_NORMAL (PWR1, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APower1Key, Strife, -1, 0)
PROP_StrifeType (139)
PROP_StrifeTeaserType (135)
PROP_StrifeTeaserType2 (138)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_PWR1")
PROP_Tag ("Power1_Key")
END_DEFAULTS
const char *APower1Key::PickupMessage ()
{
return "You picked up the Power1 Key.";
}
// Power2 Key ---------------------------------------------------------------
class APower2Key : public AStrifeKey
{
DECLARE_ACTOR (APower2Key, AStrifeKey)
public:
const char *PickupMessage ();
};
FState APower2Key::States[] =
{
S_NORMAL (PWR2, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APower2Key, Strife, -1, 0)
PROP_StrifeType (140)
PROP_StrifeTeaserType (136)
PROP_StrifeTeaserType2 (139)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_PWR2")
PROP_Tag ("Power2_Key")
END_DEFAULTS
const char *APower2Key::PickupMessage ()
{
return "You picked up the Power2 Key.";
}
// Power3 Key ---------------------------------------------------------------
class APower3Key : public AStrifeKey
{
DECLARE_ACTOR (APower3Key, AStrifeKey)
public:
const char *PickupMessage ();
};
FState APower3Key::States[] =
{
S_NORMAL (PWR3, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APower3Key, Strife, -1, 0)
PROP_StrifeType (141)
PROP_StrifeTeaserType (137)
PROP_StrifeTeaserType2 (140)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_PWR3")
PROP_Tag ("Power3_Key")
END_DEFAULTS
const char *APower3Key::PickupMessage ()
{
return "You picked up the Power3 Key.";
}
// Gold Key -----------------------------------------------------------------
class AGoldKey : public AStrifeKey
{
DECLARE_ACTOR (AGoldKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AGoldKey::States[] =
{
S_NORMAL (KY1G, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AGoldKey, Strife, 40, 0)
PROP_StrifeType (142)
PROP_StrifeTeaserType (138)
PROP_StrifeTeaserType2 (141)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_KY1G")
PROP_Tag ("Gold_Key")
END_DEFAULTS
const char *AGoldKey::PickupMessage ()
{
return "You picked up the Gold Key.";
}
// ID Card ------------------------------------------------------------------
class AIDCard : public AStrifeKey
{
DECLARE_ACTOR (AIDCard, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AIDCard::States[] =
{
S_NORMAL (CRD2, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AIDCard, Strife, 13, 0)
PROP_StrifeType (143)
PROP_StrifeTeaserType (139)
PROP_StrifeTeaserType2 (142)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_CRD2")
PROP_Tag ("ID_Card")
END_DEFAULTS
const char *AIDCard::PickupMessage ()
{
return "You picked up the ID Card.";
}
// Silver Key ---------------------------------------------------------------
class ASilverKey : public AStrifeKey
{
DECLARE_ACTOR (ASilverKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ASilverKey::States[] =
{
S_NORMAL (KY2S, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ASilverKey, Strife, 38, 0)
PROP_StrifeType (144)
PROP_StrifeTeaserType (140)
PROP_StrifeTeaserType2 (143)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_KY2S")
PROP_Tag ("Silver_Key")
END_DEFAULTS
const char *ASilverKey::PickupMessage ()
{
return "You picked up the Silver Key.";
}
// Oracle Key ---------------------------------------------------------------
class AOracleKey : public AStrifeKey
{
DECLARE_ACTOR (AOracleKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AOracleKey::States[] =
{
S_NORMAL (ORAC, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AOracleKey, Strife, 61, 0)
PROP_StrifeType (145)
PROP_StrifeTeaserType (141)
PROP_StrifeTeaserType2 (144)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_ORAC")
PROP_Tag ("Oracle_Key")
END_DEFAULTS
const char *AOracleKey::PickupMessage ()
{
return "You picked up the Oracle Key.";
}
// Military ID --------------------------------------------------------------
class AMilitaryID : public AStrifeKey
{
DECLARE_ACTOR (AMilitaryID, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AMilitaryID::States[] =
{
S_NORMAL (GYID, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMilitaryID, Strife, -1, 0)
PROP_StrifeType (146)
PROP_StrifeTeaserType (142)
PROP_StrifeTeaserType2 (145)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_GYID")
PROP_Tag ("Military ID")
END_DEFAULTS
const char *AMilitaryID::PickupMessage ()
{
return "You picked up the Military ID.";
}
// Order Key ----------------------------------------------------------------
class AOrderKey : public AStrifeKey
{
DECLARE_ACTOR (AOrderKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AOrderKey::States[] =
{
S_NORMAL (FUBR, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AOrderKey, Strife, 86, 0)
PROP_StrifeType (147)
PROP_StrifeTeaserType (143)
PROP_StrifeTeaserType2 (146)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_FUBR")
PROP_Tag ("Order_Key")
END_DEFAULTS
const char *AOrderKey::PickupMessage ()
{
return "You picked up the Order Key.";
}
// Warehouse Key ------------------------------------------------------------
class AWarehouseKey : public AStrifeKey
{
DECLARE_ACTOR (AWarehouseKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AWarehouseKey::States[] =
{
S_NORMAL (WARE, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AWarehouseKey, Strife, 166, 0)
PROP_StrifeType (148)
PROP_StrifeTeaserType (144)
PROP_StrifeTeaserType2 (147)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_WARE")
PROP_Tag ("Warehouse_Key")
END_DEFAULTS
const char *AWarehouseKey::PickupMessage ()
{
return "You picked up the Warehouse Key.";
}
// Brass Key ----------------------------------------------------------------
class ABrassKey : public AStrifeKey
{
DECLARE_ACTOR (ABrassKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ABrassKey::States[] =
{
S_NORMAL (KY3B, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ABrassKey, Strife, 39, 0)
PROP_StrifeType (149)
PROP_StrifeTeaserType (145)
PROP_StrifeTeaserType2 (148)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_KY3B")
PROP_Tag ("Brass_Key")
END_DEFAULTS
const char *ABrassKey::PickupMessage ()
{
return "You picked up the Brass Key.";
}
// Red Crystal Key ----------------------------------------------------------
class ARedCrystalKey : public AStrifeKey
{
DECLARE_ACTOR (ARedCrystalKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ARedCrystalKey::States[] =
{
S_BRIGHT (RCRY, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ARedCrystalKey, Strife, 192, 0)
PROP_StrifeType (150)
PROP_StrifeTeaserType (146)
PROP_StrifeTeaserType2 (149)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_RCRY")
PROP_Tag ("Red_Crystal_Key")
END_DEFAULTS
const char *ARedCrystalKey::PickupMessage ()
{
return "You picked up the Red Crystal Key.";
}
// Blue Crystal Key ---------------------------------------------------------
class ABlueCrystalKey : public AStrifeKey
{
DECLARE_ACTOR (ABlueCrystalKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ABlueCrystalKey::States[] =
{
S_BRIGHT (BCRY, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ABlueCrystalKey, Strife, 193, 0)
PROP_StrifeType (151)
PROP_StrifeTeaserType (147)
PROP_StrifeTeaserType2 (150)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_BCRY")
PROP_Tag ("Blue_Crystal_Key")
END_DEFAULTS
const char *ABlueCrystalKey::PickupMessage ()
{
return "You picked up the Blue Crystal Key.";
}
// Chapel Key ---------------------------------------------------------------
class AChapelKey : public AStrifeKey
{
DECLARE_ACTOR (AChapelKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AChapelKey::States[] =
{
S_NORMAL (CHAP, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AChapelKey, Strife, 195, 0)
PROP_StrifeType (152)
PROP_StrifeTeaserType (148)
PROP_StrifeTeaserType2 (151)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_CHAP")
PROP_Tag ("Chapel_Key")
END_DEFAULTS
const char *AChapelKey::PickupMessage ()
{
return "You picked up the Chapel Key.";
}
// Catacomb Key -------------------------------------------------------------
class ACatacombKey : public AStrifeKey
{
DECLARE_ACTOR (ACatacombKey, AStrifeKey)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState ACatacombKey::States[] =
{
S_NORMAL (TUNL, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ACatacombKey, Strife, -1, 0)
PROP_StrifeType (153)
PROP_StrifeTeaserType (149)
PROP_StrifeTeaserType2 (152)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_TUNL")
PROP_Tag ("Catacomb_Key") // "Tunnel_Key" in the Teaser
END_DEFAULTS
bool ACatacombKey::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[27]);
return true;
}
return false;
}
const char *ACatacombKey::PickupMessage ()
{
return "You picked up the Catacomb Key.";
}
// Security Key -------------------------------------------------------------
class ASecurityKey : public AStrifeKey
{
DECLARE_ACTOR (ASecurityKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ASecurityKey::States[] =
{
S_NORMAL (SECK, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ASecurityKey, Strife, -1, 0)
PROP_StrifeType (154)
PROP_StrifeTeaserType (150)
PROP_StrifeTeaserType2 (153)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_SECK")
PROP_Tag ("Security_Key")
END_DEFAULTS
const char *ASecurityKey::PickupMessage ()
{
return "You picked up the Security Key.";
}
// Core Key -----------------------------------------------------------------
class ACoreKey : public AStrifeKey
{
DECLARE_ACTOR (ACoreKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ACoreKey::States[] =
{
S_NORMAL (GOID, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ACoreKey, Strife, 236, 0)
PROP_StrifeType (155)
PROP_StrifeTeaserType (151)
PROP_StrifeTeaserType2 (154)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_GOID")
PROP_Tag ("Core_Key") // "New_Key1" in the Teaser
END_DEFAULTS
const char *ACoreKey::PickupMessage ()
{
return "You picked up the Core Key.";
}
// Mauler Key ---------------------------------------------------------------
class AMaulerKey : public AStrifeKey
{
DECLARE_ACTOR (AMaulerKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AMaulerKey::States[] =
{
S_NORMAL (BLTK, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMaulerKey, Strife, 233, 0)
PROP_StrifeType (156)
PROP_StrifeTeaserType (152)
PROP_StrifeTeaserType2 (155)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_BLTK")
PROP_Tag ("Mauler_Key") // "New_Key2" in the Teaser
END_DEFAULTS
const char *AMaulerKey::PickupMessage ()
{
return "You picked up the Mauler Key.";
}
// Factory Key --------------------------------------------------------------
class AFactoryKey : public AStrifeKey
{
DECLARE_ACTOR (AFactoryKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AFactoryKey::States[] =
{
S_NORMAL (PROC, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AFactoryKey, Strife, 234, 0)
PROP_StrifeType (157)
PROP_StrifeTeaserType (153)
PROP_StrifeTeaserType2 (156)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_PROC")
PROP_Tag ("Factory_Key") // "New_Key3" in the Teaser
END_DEFAULTS
const char *AFactoryKey::PickupMessage ()
{
return "You picked up the Factory Key.";
}
// Mine Key -----------------------------------------------------------------
class AMineKey : public AStrifeKey
{
DECLARE_ACTOR (AMineKey, AStrifeKey)
public:
const char *PickupMessage ();
};
FState AMineKey::States[] =
{
S_NORMAL (MINE, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AMineKey, Strife, 235, 0)
PROP_StrifeType (158)
PROP_StrifeTeaserType (154)
PROP_StrifeTeaserType2 (157)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_MINE") // "New_Key4" in the Teaser
PROP_Tag ("MINE_KEY")
END_DEFAULTS
const char *AMineKey::PickupMessage ()
{
return "You picked up the Mine Key.";
}
// New Key5 -----------------------------------------------------------------
class ANewKey5 : public AStrifeKey
{
DECLARE_ACTOR (ANewKey5, AStrifeKey)
public:
const char *PickupMessage ();
};
FState ANewKey5::States[] =
{
S_NORMAL (BLTK, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (ANewKey5, Strife, -1, 0)
PROP_StrifeType (159)
PROP_StrifeTeaserType (155)
PROP_StrifeTeaserType2 (158)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_BLTK")
PROP_Tag ("New_Key5")
END_DEFAULTS
const char *ANewKey5::PickupMessage ()
{
return "You picked up the New Key5.";
}
// Prison Pass --------------------------------------------------------------
class APrisonPass : public AKey
{
DECLARE_ACTOR (APrisonPass, AKey)
public:
bool TryPickup (AActor *toucher);
bool SpecialDropAction (AActor *dropper);
const char *PickupMessage ();
};
FState APrisonPass::States[] =
{
S_NORMAL (TOKN, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (APrisonPass, Strife, -1, 0)
PROP_StrifeType (304)
PROP_StrifeTeaserType (286)
PROP_StrifeTeaserType2 (303)
PROP_SpawnState (0)
PROP_Inventory_Icon ("I_TOKN")
PROP_Tag ("Prison_pass")
END_DEFAULTS
bool APrisonPass::TryPickup (AActor *toucher)
{
Super::TryPickup (toucher);
EV_DoDoor (DDoor::doorOpen, NULL, toucher, 223, 2*FRACUNIT, 0, 0, 0);
toucher->GiveInventoryType (QuestItemClasses[9]);
return true;
}
const char *APrisonPass::PickupMessage ()
{
return "You picked up the Prison pass.";
}
//============================================================================
//
// APrisonPass :: SpecialDropAction
//
// Trying to make a monster that drops a prison pass turns it into an
// OpenDoor223 item instead. That means the only way to get it in Strife
// is through dialog, which is why it doesn't have its own sprite.
//
//============================================================================
bool APrisonPass::SpecialDropAction (AActor *dropper)
{
EV_DoDoor (DDoor::doorOpen, NULL, dropper, 223, 2*FRACUNIT, 0, 0, 0);
Destroy ();
return true;
}
// Oracle Pass --------------------------------------------------------------
class AOraclePass : public AInventory
{
DECLARE_ACTOR (AOraclePass, AInventory)
public:
bool TryPickup (AActor *toucher);
const char *PickupMessage ();
};
FState AOraclePass::States[] =
{
S_NORMAL (OTOK, 'A', -1, NULL, NULL)
};
IMPLEMENT_ACTOR (AOraclePass, Strife, -1, 0)
PROP_StrifeType (311)
PROP_StrifeTeaserType (292)
PROP_StrifeTeaserType2 (309)
PROP_SpawnState (0)
PROP_Inventory_FlagsSet(IF_INVBAR)
PROP_Inventory_Icon ("I_OTOK")
PROP_Tag ("Oracle_Pass")
END_DEFAULTS
bool AOraclePass::TryPickup (AActor *toucher)
{
if (Super::TryPickup (toucher))
{
toucher->GiveInventoryType (QuestItemClasses[17]);
return true;
}
return false;
}
const char *AOraclePass::PickupMessage ()
{
return "You picked up the Oracle Pass.";
}

File diff suppressed because it is too large Load diff

View file

@ -4,6 +4,7 @@
#include "c_console.h" #include "c_console.h"
#include "p_enemy.h" #include "p_enemy.h"
#include "a_action.h" #include "a_action.h"
#include "gstrings.h"
static FRandom pr_bang4cloud ("Bang4Cloud"); static FRandom pr_bang4cloud ("Bang4Cloud");
static FRandom pr_lightout ("LightOut"); static FRandom pr_lightout ("LightOut");
@ -14,11 +15,6 @@ void A_TossGib (AActor *);
void A_LoopActiveSound (AActor *); void A_LoopActiveSound (AActor *);
void A_LightGoesOut (AActor *); void A_LightGoesOut (AActor *);
class ARubble1 : public AActor
{
DECLARE_ACTOR (ARubble1, AActor)
};
// A Cloud used for varius explosions --------------------------------------- // A Cloud used for varius explosions ---------------------------------------
// This actor has no direct equivalent in strife. To create this, Strife // This actor has no direct equivalent in strife. To create this, Strife
// spawned a spark and then changed its state to that of this explosion // spawned a spark and then changed its state to that of this explosion
@ -71,14 +67,14 @@ void A_Bang4Cloud (AActor *self)
void A_GiveQuestItem (AActor *self) void A_GiveQuestItem (AActor *self)
{ {
int questitem = (self->Speed >> FRACBITS) - 1; int questitem = (self->Speed >> FRACBITS);
// Give one of these quest items to every player in the game // Give one of these quest items to every player in the game
for (int i = 0; i < MAXPLAYERS; ++i) for (int i = 0; i < MAXPLAYERS; ++i)
{ {
if (playeringame[i]) if (playeringame[i])
{ {
AInventory *item = static_cast<AInventory *>(Spawn (QuestItemClasses[questitem], 0,0,0)); AInventory *item = static_cast<AInventory *>(Spawn (QuestItemClasses[questitem-1], 0,0,0));
if (!item->TryPickup (players[i].mo)) if (!item->TryPickup (players[i].mo))
{ {
item->Destroy (); item->Destroy ();
@ -86,7 +82,11 @@ void A_GiveQuestItem (AActor *self)
} }
} }
const char *name = QuestItemClasses[questitem]->Meta.GetMetaString (AMETA_StrifeName); char messageid[64];
sprintf(messageid, "TXT_QUEST_%d", questitem);
const char * name = GStrings[messageid];
if (name != NULL) if (name != NULL)
{ {
C_MidPrint (name); C_MidPrint (name);
@ -272,7 +272,7 @@ void A_LightGoesOut (AActor *self)
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
{ {
foo = Spawn<ARubble1> (self->x, self->y, self->z); foo = Spawn("Rubble1", self->x, self->y, self->z);
if (foo != NULL) if (foo != NULL)
{ {
int t = pr_lightout() & 15; int t = pr_lightout() & 15;

View file

@ -1,90 +0,0 @@
#include "actor.h"
#include "m_random.h"
#include "a_action.h"
#include "p_local.h"
#include "p_enemy.h"
#include "a_strifeglobal.h"
void A_20e10 (AActor *);
void A_TossGib (AActor *);
void A_SpawnZombie (AActor *);
// Zombie -------------------------------------------------------------------
class AZombie : public AStrifeHumanoid
{
DECLARE_ACTOR (AZombie, AStrifeHumanoid)
};
FState AZombie::States[] =
{
#define S_ZOMBIE_STND 0
S_NORMAL (PEAS, 'A', 5, A_20e10, &States[S_ZOMBIE_STND]),
#define S_ZOMBIE_PAIN (S_ZOMBIE_STND+1)
S_NORMAL (AGRD, 'A', 5, A_20e10, &States[S_ZOMBIE_PAIN]),
#define S_ZOMBIE_DIE (S_ZOMBIE_PAIN+1)
S_NORMAL (GIBS, 'M', 5, A_TossGib, &States[S_ZOMBIE_DIE+1]),
S_NORMAL (GIBS, 'N', 5, A_XScream, &States[S_ZOMBIE_DIE+2]),
S_NORMAL (GIBS, 'O', 5, A_NoBlocking, &States[S_ZOMBIE_DIE+3]),
S_NORMAL (GIBS, 'P', 4, A_TossGib, &States[S_ZOMBIE_DIE+4]),
S_NORMAL (GIBS, 'Q', 4, A_TossGib, &States[S_ZOMBIE_DIE+5]),
S_NORMAL (GIBS, 'R', 4, A_TossGib, &States[S_ZOMBIE_DIE+6]),
S_NORMAL (GIBS, 'S', 4, A_TossGib, &States[S_ZOMBIE_DIE+7]),
S_NORMAL (GIBS, 'T', 4, A_TossGib, &States[S_ZOMBIE_DIE+8]),
S_NORMAL (GIBS, 'U', 5, NULL, &States[S_ZOMBIE_DIE+9]),
S_NORMAL (GIBS, 'V', 1400, NULL, NULL),
};
IMPLEMENT_ACTOR (AZombie, Strife, 169, 0)
PROP_SpawnState (S_ZOMBIE_STND)
PROP_PainState (S_ZOMBIE_PAIN)
PROP_DeathState (S_ZOMBIE_DIE)
PROP_SpawnHealth (31)
PROP_RadiusFixed (20)
PROP_HeightFixed (56)
PROP_PainChance (0)
PROP_Flags (MF_SOLID|MF_SHOOTABLE)
PROP_Flags2 (MF2_FLOORCLIP|MF2_PASSMOBJ|MF2_PUSHWALL|MF2_MCROSS)
PROP_MinMissileChance (150)
PROP_MaxStepHeight (16)
PROP_MaxDropOffHeight (32)
PROP_Translation (TRANSLATION_Standard, 0)
PROP_StrifeType (28)
PROP_DeathSound ("zombie/death")
END_DEFAULTS
// Zombie Spawner -----------------------------------------------------------
class AZombieSpawner : public AActor
{
DECLARE_ACTOR (AZombieSpawner, AActor)
};
FState AZombieSpawner::States[] =
{
S_NORMAL (TNT1, 'A', 175, A_SpawnZombie, &States[0])
};
IMPLEMENT_ACTOR (AZombieSpawner, Strife, 170, 0)
PROP_SpawnHealth (20)
PROP_Flags (MF_SHOOTABLE|MF_NOSECTOR)
PROP_SpawnState (0)
PROP_RenderStyle (STYLE_None)
PROP_StrifeType (30)
PROP_ActiveSound ("zombie/spawner") // Does Strife use this somewhere else?
END_DEFAULTS
//============================================================================
//
// A_SpawnZombie
//
//============================================================================
void A_SpawnZombie (AActor *self)
{
Spawn<AZombie> (self->x, self->y, self->z);
}

View file

@ -84,7 +84,7 @@ xx(Extreme)
// Damage types // Damage types
xx(Fire) xx(Fire)
xx(Ice) //xx(Ice) already defined above
xx(Disintegrate) xx(Disintegrate)
xx(Water) xx(Water)
xx(Slime) xx(Slime)

View file

@ -643,7 +643,7 @@ static void TakeStrifeItem (const TypeInfo *itemtype, int amount)
return; return;
// Don't take quest items. // Don't take quest items.
if (itemtype->IsDescendantOf (RUNTIME_CLASS(AQuestItem))) if (itemtype->IsDescendantOf (TypeInfo::FindType("QuestItem")))
return; return;
// Don't take keys // Don't take keys

View file

@ -1393,7 +1393,16 @@ FUNC(LS_ACS_ExecuteAlways)
FUNC(LS_ACS_LockedExecute) FUNC(LS_ACS_LockedExecute)
// ACS_LockedExecute (script, map, s_arg1, s_arg2, lock) // ACS_LockedExecute (script, map, s_arg1, s_arg2, lock)
{ {
if (arg4 && !P_CheckKeys (it, arg4, 1)) if (arg4 && !P_CheckKeys (it, arg4, true))
return false;
else
return LS_ACS_Execute (ln, it, backSide, arg0, arg1, arg2, arg3, 0);
}
FUNC(LS_ACS_LockedExecuteDoor)
// ACS_LockedExecuteDoor (script, map, s_arg1, s_arg2, lock)
{
if (arg4 && !P_CheckKeys (it, arg4, false))
return false; return false;
else else
return LS_ACS_Execute (ln, it, backSide, arg0, arg1, arg2, arg3, 0); return LS_ACS_Execute (ln, it, backSide, arg0, arg1, arg2, arg3, 0);
@ -2556,8 +2565,8 @@ lnSpecFunc LineSpecials[256] =
LS_Door_Raise, LS_Door_Raise,
LS_Door_LockedRaise, LS_Door_LockedRaise,
LS_Door_Animated, LS_Door_Animated,
LS_Autosave, // Autosave LS_Autosave,
LS_NOP, // 16 LS_NOP, // Transfer_WallLight
LS_NOP, // 17 LS_NOP, // 17
LS_NOP, // 18 LS_NOP, // 18
LS_NOP, // 19 LS_NOP, // 19
@ -2626,7 +2635,7 @@ lnSpecFunc LineSpecials[256] =
LS_ACS_Terminate, LS_ACS_Terminate,
LS_ACS_LockedExecute, LS_ACS_LockedExecute,
LS_ACS_ExecuteWithResult, LS_ACS_ExecuteWithResult,
LS_NOP, // 85 LS_ACS_LockedExecuteDoor,
LS_NOP, // 86 LS_NOP, // 86
LS_NOP, // 87 LS_NOP, // 87
LS_NOP, // 88 LS_NOP, // 88

View file

@ -127,6 +127,7 @@ typedef enum {
ACS_Terminate = 82, ACS_Terminate = 82,
ACS_LockedExecute = 83, ACS_LockedExecute = 83,
ACS_ExecuteWithResult = 84, ACS_ExecuteWithResult = 84,
ACS_LockedExecuteDoor = 85,
Polyobj_OR_RotateLeft = 90, Polyobj_OR_RotateLeft = 90,
Polyobj_OR_RotateRight = 91, Polyobj_OR_RotateRight = 91,

View file

@ -2551,7 +2551,7 @@ BOOL PTR_AimTraverse (intercept_t* in)
if ((th->flags3 & MF3_GHOST) && if ((th->flags3 & MF3_GHOST) &&
shootthing->player && // [RH] Be sure shootthing is a player shootthing->player && // [RH] Be sure shootthing is a player
shootthing->player->ReadyWeapon && shootthing->player->ReadyWeapon &&
(shootthing->player->ReadyWeapon->WeaponFlags & WIF_HITS_GHOSTS)) (shootthing->player->ReadyWeapon->flags2 & MF2_THRUGHOST))
{ {
return true; return true;
} }
@ -2695,7 +2695,7 @@ void P_LineAttack (AActor *t1, angle_t angle, fixed_t distance,
hitGhosts = (t1->player != NULL && hitGhosts = (t1->player != NULL &&
t1->player->ReadyWeapon != NULL && t1->player->ReadyWeapon != NULL &&
(t1->player->ReadyWeapon->WeaponFlags & WIF_HITS_GHOSTS)); (t1->player->ReadyWeapon->flags2 & MF2_THRUGHOST));
if (!Trace (t1->x, t1->y, shootz, t1->Sector, vx, vy, vz, distance, if (!Trace (t1->x, t1->y, shootz, t1->Sector, vx, vy, vz, distance,
MF_SHOOTABLE, ML_BLOCKEVERYTHING, t1, trace, MF_SHOOTABLE, ML_BLOCKEVERYTHING, t1, trace,

View file

@ -89,6 +89,7 @@ static FRandom pr_spawnmapthing ("SpawnMapThing");
static FRandom pr_spawnpuff ("SpawnPuff"); static FRandom pr_spawnpuff ("SpawnPuff");
static FRandom pr_spawnblood ("SpawnBlood"); static FRandom pr_spawnblood ("SpawnBlood");
static FRandom pr_splatter ("BloodSplatter"); static FRandom pr_splatter ("BloodSplatter");
static FRandom pr_takedamage ("TakeDamage");
static FRandom pr_ripperblood ("RipperBlood"); static FRandom pr_ripperblood ("RipperBlood");
static FRandom pr_chunk ("Chunk"); static FRandom pr_chunk ("Chunk");
static FRandom pr_checkmissilespawn ("CheckMissileSpawn"); static FRandom pr_checkmissilespawn ("CheckMissileSpawn");
@ -3051,6 +3052,7 @@ AActor *AActor::StaticSpawn (const TypeInfo *type, fixed_t ix, fixed_t iy, fixed
actor->frame = st->GetFrame(); actor->frame = st->GetFrame();
actor->renderflags = (actor->renderflags & ~RF_FULLBRIGHT) | st->GetFullbright(); actor->renderflags = (actor->renderflags & ~RF_FULLBRIGHT) | st->GetFullbright();
actor->touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98 actor->touching_sectorlist = NULL; // NULL head of sector list // phares 3/13/98
actor->Speed = actor->GetClass()->Meta.GetMetaFixed(AMETA_FastSpeed, actor->Speed);
// set subsector and/or block links // set subsector and/or block links
actor->LinkToWorld (SpawningMapThing); actor->LinkToWorld (SpawningMapThing);
@ -4595,6 +4597,16 @@ int AActor::DoSpecialDamage (AActor *target, int damage)
} }
else else
{ {
if (target->player)
{
int poisondamage = GetClass()->Meta.GetMetaInt(AMETA_PoisonDamage);
if (poisondamage > 0)
{
P_PoisonPlayer (target->player, this, this->target, poisondamage);
damage >>= 1;
}
}
return damage; return damage;
} }
} }
@ -4607,6 +4619,16 @@ int AActor::TakeSpecialDamage (AActor *inflictor, AActor *source, int damage, in
// it needs to work. // it needs to work.
FState *death; FState *death;
if (flags5 & MF5_NODAMAGE)
{
target = source;
if (PainState != NULL && pr_takedamage() < PainChance)
{
SetState (PainState);
}
return -1;
}
if (DeathState != NULL) if (DeathState != NULL)
{ {
return damage; return damage;

View file

@ -194,7 +194,7 @@ void DRotatePoly::Tick ()
return; return;
} }
m_Dist -= absSpeed; m_Dist -= absSpeed;
if (m_Dist <= 0 && m_Dist+absSpeed>0) if (m_Dist == 0)
{ {
polyobj_t *poly = GetPolyobj (m_PolyObj); polyobj_t *poly = GetPolyobj (m_PolyObj);
if (poly->specialdata == this) if (poly->specialdata == this)

View file

@ -69,6 +69,8 @@
#include "thingdef.h" #include "thingdef.h"
const TypeInfo *QuestItemClasses[31];
extern TArray<FActorInfo *> Decorations; extern TArray<FActorInfo *> Decorations;
@ -221,6 +223,7 @@ static flagdef ActorFlags[]=
DEFINE_FLAG(MF5, NODROPOFF, AActor, flags5), DEFINE_FLAG(MF5, NODROPOFF, AActor, flags5),
DEFINE_FLAG(MF5, BOUNCEONACTORS, AActor, flags5), DEFINE_FLAG(MF5, BOUNCEONACTORS, AActor, flags5),
DEFINE_FLAG(MF5, EXPLODEONWATER, AActor, flags5), DEFINE_FLAG(MF5, EXPLODEONWATER, AActor, flags5),
DEFINE_FLAG(MF5, NODAMAGE, AActor, flags5),
// Effect flags // Effect flags
DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects), DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),
@ -444,12 +447,14 @@ ACTOR(ClearShadow)
ACTOR(GetHurt) ACTOR(GetHurt)
ACTOR(TurretLook) ACTOR(TurretLook)
ACTOR(KlaxonBlare) ACTOR(KlaxonBlare)
ACTOR(20e10) ACTOR(CheckTerrain)
ACTOR(Countdown) ACTOR(Countdown)
ACTOR(AlertMonsters) ACTOR(AlertMonsters)
ACTOR(ClearSoundTarget)
ACTOR(FireAssaultGun) ACTOR(FireAssaultGun)
ACTOR(PlaySound) ACTOR(PlaySound)
ACTOR(PlayWeaponSound) ACTOR(PlayWeaponSound)
ACTOR(FLoopActiveSound)
ACTOR(LoopActiveSound) ACTOR(LoopActiveSound)
ACTOR(StopSound) ACTOR(StopSound)
ACTOR(SeekerMissile) ACTOR(SeekerMissile)
@ -500,6 +505,7 @@ ACTOR(GiveToTarget)
ACTOR(TakeFromTarget) ACTOR(TakeFromTarget)
ACTOR(JumpIfInTargetInventory) ACTOR(JumpIfInTargetInventory)
ACTOR(CountdownArg) ACTOR(CountdownArg)
ACTOR(CustomMeleeAttack)
#include "d_dehackedactions.h" #include "d_dehackedactions.h"
@ -620,8 +626,9 @@ AFuncDesc AFTable[]=
FUNC(A_KlaxonBlare, NULL) FUNC(A_KlaxonBlare, NULL)
FUNC(A_Countdown, NULL) FUNC(A_Countdown, NULL)
FUNC(A_AlertMonsters, NULL) FUNC(A_AlertMonsters, NULL)
FUNC(A_ClearSoundTarget, NULL)
FUNC(A_FireAssaultGun, NULL) FUNC(A_FireAssaultGun, NULL)
{"A_CheckTerrain", A_20e10, NULL }, // This needs a better name! FUNC(A_CheckTerrain, NULL )
// Only selected original weapon functions will be available. // Only selected original weapon functions will be available.
// All the attack pointers are somewhat tricky due to the way the flash state is handled // All the attack pointers are somewhat tricky due to the way the flash state is handled
@ -642,6 +649,7 @@ AFuncDesc AFTable[]=
FUNC(A_BulletAttack, NULL) FUNC(A_BulletAttack, NULL)
FUNC(A_PlaySound, "S" ) FUNC(A_PlaySound, "S" )
FUNC(A_PlayWeaponSound, "S" ) FUNC(A_PlayWeaponSound, "S" )
FUNC(A_FLoopActiveSound, NULL )
FUNC(A_LoopActiveSound, NULL ) FUNC(A_LoopActiveSound, NULL )
FUNC(A_StopSound, NULL ) FUNC(A_StopSound, NULL )
FUNC(A_SeekerMissile, "XX" ) FUNC(A_SeekerMissile, "XX" )
@ -684,6 +692,7 @@ AFuncDesc AFTable[]=
FUNC(A_GiveToTarget, "Mx" ) FUNC(A_GiveToTarget, "Mx" )
FUNC(A_TakeFromTarget, "Mx" ) FUNC(A_TakeFromTarget, "Mx" )
FUNC(A_CountdownArg, "X") FUNC(A_CountdownArg, "X")
FUNC(A_CustomMeleeAttack, "XXXsty" )
}; };
//========================================================================== //==========================================================================
@ -2079,17 +2088,6 @@ void ParseActorProperties (Baggage &bag)
SC_ScriptError("\"%s\" is an unknown actor property\n", propname.GetChars()); SC_ScriptError("\"%s\" is an unknown actor property\n", propname.GetChars());
} }
} }
// copy the THRUGHOST flag to the HITS_GHOSTS weapon flag
// Their meaning is synonymous so it really doesn't make sense
// to have two different flags for this
if (bag.Info->Class->IsDescendantOf(RUNTIME_CLASS(AWeapon)))
{
AWeapon * weapon=(AWeapon*)bag.Info->Defaults;
if (weapon->flags2&MF2_THRUGHOST) weapon->WeaponFlags|=WIF_HITS_GHOSTS;
else weapon->WeaponFlags&=~WIF_HITS_GHOSTS;
}
} }
//========================================================================== //==========================================================================
@ -2248,12 +2246,40 @@ static void ActorSpawnID (AActor *defaults, Baggage &bag)
//========================================================================== //==========================================================================
static void ActorConversationID (AActor *defaults, Baggage &bag) static void ActorConversationID (AActor *defaults, Baggage &bag)
{ {
int convid;
SC_MustGetNumber(); SC_MustGetNumber();
if (sc_Number<0 || sc_Number>344) convid = sc_Number;
// Handling for Strife teaser IDs - only of meaning for the standard items
// as PWADs cannot be loaded with the teasers.
if (SC_CheckString(","))
{
SC_MustGetNumber();
if ((gameinfo.flags & (GI_SHAREWARE|GI_TEASER2)) == (GI_SHAREWARE))
convid=sc_Number;
SC_MustGetStringName(",");
SC_MustGetNumber();
if ((gameinfo.flags & (GI_SHAREWARE|GI_TEASER2)) == (GI_SHAREWARE|GI_TEASER2))
convid=sc_Number;
if (convid==-1) return;
}
if (convid<0 || convid>344)
{ {
SC_ScriptError ("ConversationID must be in the range [0,344]"); SC_ScriptError ("ConversationID must be in the range [0,344]");
} }
else StrifeTypes[sc_Number] = bag.Info->Class; else StrifeTypes[convid] = bag.Info->Class;
}
//==========================================================================
//
//==========================================================================
static void ActorTag (AActor *defaults, Baggage &bag)
{
SC_MustGetString();
bag.Info->Class->Meta.SetMetaString(AMETA_StrifeName, sc_String);
} }
//========================================================================== //==========================================================================
@ -2771,7 +2797,7 @@ static void ActorTranslation (AActor *defaults, Baggage &bag)
{ {
if (SC_CheckNumber()) if (SC_CheckNumber())
{ {
int max = gameinfo.gametype==GAME_Strife? 6:2; int max = (gameinfo.gametype==GAME_Strife || (bag.Info->GameFilter&GAME_Strife)) ? 6:2;
if (sc_Number < 0 || sc_Number > max) if (sc_Number < 0 || sc_Number > max)
{ {
SC_ScriptError ("Translation must be in the range [0,%d]", max); SC_ScriptError ("Translation must be in the range [0,%d]", max);
@ -2889,6 +2915,24 @@ static void ActorMaxDropoffHeight (AActor *defaults, Baggage &bag)
defaults->MaxDropOffHeight=sc_Number; defaults->MaxDropOffHeight=sc_Number;
} }
//==========================================================================
//
//==========================================================================
static void ActorPoisonDamage (AActor *defaults, Baggage &bag)
{
SC_MustGetNumber();
bag.Info->Class->Meta.SetMetaInt (AMETA_PoisonDamage, sc_Number);
}
//==========================================================================
//
//==========================================================================
static void ActorFastSpeed (AActor *defaults, Baggage &bag)
{
SC_MustGetFloat();
bag.Info->Class->Meta.SetMetaFixed (AMETA_FastSpeed, fixed_t(sc_Float*FRACUNIT));
}
//========================================================================== //==========================================================================
// //
//========================================================================== //==========================================================================
@ -3143,6 +3187,15 @@ static void InventoryUsesound (AInventory *defaults, Baggage &bag)
defaults->UseSound=S_FindSound(sc_String); defaults->UseSound=S_FindSound(sc_String);
} }
//==========================================================================
//
//==========================================================================
static void InventoryGiveQuest (APuzzleItem *defaults, Baggage &bag)
{
SC_MustGetNumber();
bag.Info->Class->Meta.SetMetaInt(AIMETA_GiveQuest, sc_Number);
}
//========================================================================== //==========================================================================
// //
//========================================================================== //==========================================================================
@ -3446,6 +3499,7 @@ static const ActorProps props[] =
{ "dropitem", ActorDropItem, RUNTIME_CLASS(AActor) }, { "dropitem", ActorDropItem, RUNTIME_CLASS(AActor) },
{ "explosiondamage", ActorExplosionDamage, RUNTIME_CLASS(AActor) }, { "explosiondamage", ActorExplosionDamage, RUNTIME_CLASS(AActor) },
{ "explosionradius", ActorExplosionRadius, RUNTIME_CLASS(AActor) }, { "explosionradius", ActorExplosionRadius, RUNTIME_CLASS(AActor) },
{ "fastspeed", ActorFastSpeed, RUNTIME_CLASS(AActor) },
{ "game", ActorGame, RUNTIME_CLASS(AActor) }, { "game", ActorGame, RUNTIME_CLASS(AActor) },
{ "gibhealth", ActorGibHealth, RUNTIME_CLASS(AActor) }, { "gibhealth", ActorGibHealth, RUNTIME_CLASS(AActor) },
{ "greetings", ActorGreetingsState, RUNTIME_CLASS(AActor) }, { "greetings", ActorGreetingsState, RUNTIME_CLASS(AActor) },
@ -3456,6 +3510,7 @@ static const ActorProps props[] =
{ "ice", ActorIceState, RUNTIME_CLASS(AActor) }, { "ice", ActorIceState, RUNTIME_CLASS(AActor) },
{ "inventory.amount", (apf)InventoryAmount, RUNTIME_CLASS(AInventory) }, { "inventory.amount", (apf)InventoryAmount, RUNTIME_CLASS(AInventory) },
{ "inventory.defmaxamount", (apf)InventoryDefMaxAmount, RUNTIME_CLASS(AInventory) }, { "inventory.defmaxamount", (apf)InventoryDefMaxAmount, RUNTIME_CLASS(AInventory) },
{ "inventory.givequest", (apf)InventoryGiveQuest, RUNTIME_CLASS(AInventory) },
{ "inventory.icon", (apf)InventoryIcon, RUNTIME_CLASS(AInventory) }, { "inventory.icon", (apf)InventoryIcon, RUNTIME_CLASS(AInventory) },
{ "inventory.maxamount", (apf)InventoryMaxAmount, RUNTIME_CLASS(AInventory) }, { "inventory.maxamount", (apf)InventoryMaxAmount, RUNTIME_CLASS(AInventory) },
{ "inventory.pickupmessage", (apf)InventoryPickupmsg, RUNTIME_CLASS(AInventory) }, { "inventory.pickupmessage", (apf)InventoryPickupmsg, RUNTIME_CLASS(AInventory) },
@ -3479,6 +3534,7 @@ static const ActorProps props[] =
{ "pain", ActorPainState, RUNTIME_CLASS(AActor) }, { "pain", ActorPainState, RUNTIME_CLASS(AActor) },
{ "painchance", ActorPainChance, RUNTIME_CLASS(AActor) }, { "painchance", ActorPainChance, RUNTIME_CLASS(AActor) },
{ "painsound", ActorPainSound, RUNTIME_CLASS(AActor) }, { "painsound", ActorPainSound, RUNTIME_CLASS(AActor) },
{ "poisondamage", ActorPoisonDamage, RUNTIME_CLASS(AActor) },
{ "powerup.color", (apf)PowerupColor, RUNTIME_CLASS(APowerupGiver) }, { "powerup.color", (apf)PowerupColor, RUNTIME_CLASS(APowerupGiver) },
{ "powerup.duration", (apf)PowerupDuration, RUNTIME_CLASS(APowerupGiver) }, { "powerup.duration", (apf)PowerupDuration, RUNTIME_CLASS(APowerupGiver) },
{ "powerup.type", (apf)PowerupType, RUNTIME_CLASS(APowerupGiver) }, { "powerup.type", (apf)PowerupType, RUNTIME_CLASS(APowerupGiver) },
@ -3496,6 +3552,7 @@ static const ActorProps props[] =
{ "spawnid", ActorSpawnID, RUNTIME_CLASS(AActor) }, { "spawnid", ActorSpawnID, RUNTIME_CLASS(AActor) },
{ "speed", ActorSpeed, RUNTIME_CLASS(AActor) }, { "speed", ActorSpeed, RUNTIME_CLASS(AActor) },
{ "states", ActorStates, RUNTIME_CLASS(AActor) }, { "states", ActorStates, RUNTIME_CLASS(AActor) },
{ "tag", ActorTag, RUNTIME_CLASS(AActor) },
{ "translation", ActorTranslation, RUNTIME_CLASS(AActor) }, { "translation", ActorTranslation, RUNTIME_CLASS(AActor) },
{ "weapon.ammogive", (apf)WeaponAmmoGive1, RUNTIME_CLASS(AWeapon) }, { "weapon.ammogive", (apf)WeaponAmmoGive1, RUNTIME_CLASS(AWeapon) },
{ "weapon.ammogive1", (apf)WeaponAmmoGive1, RUNTIME_CLASS(AWeapon) }, { "weapon.ammogive1", (apf)WeaponAmmoGive1, RUNTIME_CLASS(AWeapon) },
@ -3626,4 +3683,12 @@ void FinishThingdef()
} }
} }
} }
// Since these are defined in DECORATE now the table has to be initialized here.
for(int i=0;i<31;i++)
{
char fmt[20];
sprintf(fmt, "QuestItem%d", i+1);
QuestItemClasses[i]=TypeInfo::FindType(fmt);
}
} }

View file

@ -70,6 +70,7 @@ static FRandom pr_camissile ("CustomActorfire");
static FRandom pr_camelee ("CustomMelee"); static FRandom pr_camelee ("CustomMelee");
static FRandom pr_cabullet ("CustomBullet"); static FRandom pr_cabullet ("CustomBullet");
static FRandom pr_cajump ("CustomJump"); static FRandom pr_cajump ("CustomJump");
static FRandom pr_custommelee ("CustomMelee2");
static FRandom pr_cwbullet ("CustomWpBullet"); static FRandom pr_cwbullet ("CustomWpBullet");
static FRandom pr_cwjump ("CustomWpJump"); static FRandom pr_cwjump ("CustomWpJump");
static FRandom pr_cwpunch ("CustomWpPunch"); static FRandom pr_cwpunch ("CustomWpPunch");
@ -660,6 +661,44 @@ void A_CustomBulletAttack (AActor *self)
} }
} }
//==========================================================================
//
// A fully customizable melee attack
//
//==========================================================================
void A_CustomMeleeAttack (AActor *self)
{
int index=CheckIndex(6);
if (index<0) return;
int Multiplier = EvalExpressionI (StateParameters[index], self);
int Modulus = EvalExpressionI (StateParameters[index+1], self);
int Adder = EvalExpressionI (StateParameters[index+2], self);
int MeleeSound=StateParameters[index+3];
const char * DamageType = (const char*)StateParameters[index+4];
bool bleed = EvalExpressionN (StateParameters[index+5], self);
int mod;
// This needs to be redesigned once the customizable damage type system is working
if (DamageType == NULL) mod=MOD_HIT;
else if (!stricmp(DamageType, "Fire")) mod=MOD_FIRE;
else if (!stricmp(DamageType, "Ice")) mod=MOD_ICE;
else if (!stricmp(DamageType, "Disintegrate")) mod=MOD_DISINTEGRATE;
else mod=MOD_HIT;
if (!self->target)
return;
A_FaceTarget (self);
if (self->CheckMeleeRange ())
{
int damage = ((pr_custommelee()%Modulus)*Multiplier)+Adder;
if (MeleeSound) S_SoundID (self, CHAN_WEAPON, MeleeSound, 1, ATTN_NORM);
P_DamageMobj (self->target, self, self, damage, MOD_HIT);
if (bleed) P_TraceBleed (damage, self->target, self);
}
}
//========================================================================== //==========================================================================
// //
// State jump function // State jump function
@ -1045,7 +1084,7 @@ void A_SpawnItem(AActor * self)
if (index<0) return; if (index<0) return;
const TypeInfo * missile= TypeInfo::FindType((const char *)StateParameters[index]); const TypeInfo * missile= TypeInfo::FindType((const char *)StateParameters[index]);
int distance = EvalExpressionI (StateParameters[index+1], self); fixed_t distance = EvalExpressionF (StateParameters[index+1], self);
fixed_t zheight = fixed_t(EvalExpressionF (StateParameters[index+2], self) * FRACUNIT); fixed_t zheight = fixed_t(EvalExpressionF (StateParameters[index+2], self) * FRACUNIT);
bool useammo = EvalExpressionN (StateParameters[index+3], self); bool useammo = EvalExpressionN (StateParameters[index+3], self);
@ -1263,7 +1302,7 @@ void A_SetTranslucent(AActor * self)
if (mode != STYLE_Fuzzy) if (mode != STYLE_Fuzzy)
{ {
if (self->alpha == 0) mode = STYLE_None; if (self->alpha == 0) mode = STYLE_None;
else if (mode == STYLE_Translucent && self->alpha == FRACUNIT) mode = STYLE_Normal; else if (mode == STYLE_Translucent && self->alpha >= FRACUNIT) mode = STYLE_Normal;
} }
self->RenderStyle=mode; self->RenderStyle=mode;

View file

@ -23,3 +23,14 @@
#include "actors/hexen/puzzleitems.txt" #include "actors/hexen/puzzleitems.txt"
#include "actors/hexen/scriptprojectiles.txt" #include "actors/hexen/scriptprojectiles.txt"
#include "actors/hexen/speedboots.txt" #include "actors/hexen/speedboots.txt"
#include "actors/strife/beggars.txt"
#include "actors/strife/merchants.txt"
#include "actors/strife/peasants.txt"
#include "actors/strife/questitems.txt"
#include "actors/strife/ratbuddy.txt"
#include "actors/strife/strifearmor.txt"
#include "actors/strife/strifeitems.txt"
#include "actors/strife/strifekeys.txt"
#include "actors/strife/strifestuff.txt"
#include "actors/strife/zombie.txt"

View file

@ -102,8 +102,7 @@ ACTOR ZTwinedTorchUnlit : ZTwinedTorch 117
States States
{ {
Spawn: Spawn:
TWTR I -1 Goto Super.Inactive
Stop
} }
} }
@ -135,8 +134,7 @@ ACTOR ZWallTorchUnlit : ZWallTorch 55
States States
{ {
Spawn: Spawn:
WLTR I -1 Goto Super.Inactive
Stop
} }
} }
@ -221,8 +219,7 @@ ACTOR ZFireBullUnlit : ZFireBull 8043
States States
{ {
Spawn: Spawn:
FBUL H -1 Goto Super.Inactive+2
Stop
} }
} }
@ -279,14 +276,13 @@ ACTOR ZCauldron : SwitchableDecoration 8069
} }
} }
ACTOR ZCauldronUnlit : ZCauldron ACTOR ZCauldronUnlit : ZCauldron 8070
{ {
Game Hexen Game Hexen
States States
{ {
Spawn: Spawn:
CDRN A -1 Goto Super.Inactive
Stop
} }
} }

View file

@ -1 +1,135 @@
// // Fire Ball ----------------------------------------------------------------
ACTOR FireBall
{
Game Hexen
SpawnID 10
Speed 2
Radius 8
Height 8
Damage 4
DamageType Fire
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
+NOTELEPORT
RenderStyle Add
DeathSound "Fireball"
States
{
Spawn:
FBL1 AB 4 Bright
Loop
Death:
XPL1 ABCDEF 4 Bright
Stop
}
}
// Arrow --------------------------------------------------------------------
ACTOR Arrow
{
Game Hexen
SpawnID 50
Speed 6
Radius 8
Height 4
Damage 4
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
+NOTELEPORT
States
{
Spawn:
ARRW A -1
Stop
Death:
ARRW A 1
Stop
}
}
// Dart ---------------------------------------------------------------------
ACTOR Dart
{
Game Hexen
SpawnID 51
Speed 6
Radius 8
Height 4
Damage 2
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
+NOTELEPORT
States
{
Spawn:
DART A -1
Stop
Death:
DART A 1
Stop
}
}
// Poison Dart --------------------------------------------------------------
ACTOR PoisonDart : Dart
{
Game Hexen
SpawnID 52
PoisonDamage 20
}
// Ripper Ball --------------------------------------------------------------
ACTOR RipperBall
{
Game Hexen
SpawnID 53
Speed 6
Radius 8
Damage 2
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
+NOTELEPORT +RIPPER
States
{
Spawn:
RIPP ABC 3
Loop
Death:
CFCF Q 4 Bright
CFCF R 3 Bright
CFCF S 4 Bright
CFCF T 3 Bright
CFCF U 4 Bright
CFCF V 3 Bright
CFCF W 4 Bright
CFCF X 3 Bright
CFCF Y 4 Bright
CFCF Z 3 Bright
Stop
}
}
// Projectile Blade ---------------------------------------------------------
ACTOR ProjectileBlade
{
Game Hexen
SpawnID 64
Speed 6
Radius 6
Height 6
Damage 3
+NOBLOCKMAP +NOGRAVITY +DROPOFF +MISSILE
+NOTELEPORT
States
{
Spawn:
BLAD A -1
Stop
Death:
BLAD A 1
Stop
}
}

View file

@ -0,0 +1,96 @@
// Base class for the beggars ---------------------------------------------
ACTOR Beggar : StrifeHumanoid
{
Health 20
PainChance 250
Speed 3
Radius 20
Height 56
Monster
+JUSTHIT
-COUNTKILL
+NOSPLASHALERT
MinMissileChance 150
Tag "Beggar"
MaxStepHeight 16
MaxDropoffHeight 32
AttackSound "beggar/attack"
PainSound "beggar/pain"
DeathSound "beggar/death"
States
{
Spawn:
BEGR A 10 A_Look
Loop
See:
BEGR AABBCC 4 A_Wander
Loop
Melee:
BEGR D 8
BEGR D 8 A_CustomMeleeAttack(2, 5, 2)
BEGR E 1 A_Chase
BEGR D 8 A_SentinelRefire
Loop
Pain:
BEGR A 3 A_Pain
BEGR A 3 A_Chase
Goto Melee
Death:
BEGR F 4
BEGR G 4 A_Scream
BEGR H 4
BEGR I 4 A_NoBlocking
BEGR JKLM 4
BEGR N -1
Stop
XDeath:
BEGR F 5 A_TossGib
GIBS M 5 A_TossGib
GIBS N 5 A_XScream
GIBS O 5 A_NoBlocking
GIBS PQRST 4 A_TossGib
GIBS U 5
GIBS V 1400
Stop
}
}
// Beggars -----------------------------------------------------------------
ACTOR Beggar1 : Beggar 141
{
Game Strife
ConversationID 38, 37, 38
}
ACTOR Beggar2 : Beggar 155
{
Game Strife
ConversationID 39, 38, 39
}
ACTOR Beggar3 : Beggar 156
{
Game Strife
ConversationID 40, 39, 40
}
ACTOR Beggar4 : Beggar 157
{
Game Strife
ConversationID 41, 40, 41
}
ACTOR Beggar5 : Beggar 158
{
Game Strife
ConversationID 42, 41, 42
}

View file

@ -0,0 +1,99 @@
// Base class for the merchants ---------------------------------------------
ACTOR Merchant
{
Health 10000000
PainChance 256 // a merchant should always enter the pain state when getting hurt
Radius 20
Height 56
Mass 5000
+SOLID
+SHOOTABLE
+NOTDMATCH
+NOSPLASHALERT
+NODAMAGE
States
{
Spawn:
MRST A 10 A_Look2
Loop
MRLK A 30 A_ActiveSound
Loop
MRLK B 30
Loop
MRBD ABCDEDCB 4
MRBD A 5
MRBD F 6
Loop
See:
Pain:
MRPN A 3 A_AlertMonsters
MRPN B 3 A_Pain
MRPN C 3
MRPN D 9 Door_CloseWaitOpen(999, 64, 960)
MRPN C 4
MRPN B 3
MRPN A 3 A_ClearSoundTarget
Goto Spawn
Yes:
MRYS A 20
// Fall through
Greetings:
MRGT ABCDEFGHI 5
Goto Spawn
No:
MRNO AB 6
MRNO C 10
MRNO BA 6
Goto Greetings
}
}
// Weapon Smith -------------------------------------------------------------
ACTOR WeaponSmith : Merchant 116
{
Game Strife
ConversationID 2
PainSound "smith/pain"
Tag "Weapon_Smith"
}
// Bar Keep -----------------------------------------------------------------
ACTOR BarKeep : Merchant 72
{
Game Strife
Translation 4
ConversationID 3
PainSound "barkeep/pain"
ActiveSound "barkeep/active"
Tag "Bar_Keep"
}
// Armorer ------------------------------------------------------------------
ACTOR Armorer : Merchant 73
{
Game Strife
Translation 5
ConversationID 4
PainSound "armorer/pain"
Tag "Armorer"
}
// Medic --------------------------------------------------------------------
ACTOR Medic : Merchant 74
{
Game Strife
Translation 6
ConversationID 5
PainSound "medic/pain"
Tag "Medic"
}

View file

@ -0,0 +1,223 @@
// Peasant Base Class -------------------------------------------------------
ACTOR Peasant : StrifeHumanoid
{
Health 31
PainChance 200
Speed 8
Radius 20
Height 56
Monster
+FRIENDLY
-COUNTKILL
+NOSPLASHALERT
MinMissileChance 150
MaxStepHeight 16
MaxDropoffHeight 32
SeeSound "peasant/sight"
AttackSound "peasant/attack"
PainSound "peasant/pain"
DeathSound "peasant/death"
States
{
Spawn:
PEAS A 10 A_Look2
Loop
See:
PEAS AABBCCDD 5 A_Wander
Loop
Melee:
PEAS E 10 A_FaceTarget
PEAS F 8 A_CustomMeleeAttack(2, 5, 2)
PEAS E 8
Goto See
Pain:
PEAS O 3
PEAS O 3 A_Pain
Goto Melee
Wound:
PEAS G 5
PEAS H 10 A_GetHurt
PEAS I 6
Goto Wound+1
Death:
PEAS G 5
PEAS H 5 A_Scream
PEAS I 6
PEAS J 5 A_NoBlocking
PEAS K 5
PEAS L 6
PEAS M 8
PEAS N 1400
GIBS U 5
GIBS V 1400
Stop
XDeath:
GIBS M 5 A_TossGib
GIBS N 5 A_XScream
GIBS O 5 A_NoBlocking
GIBS PQRS 4 A_TossGib
Goto Death+8
}
}
// Peasant Variant 1 --------------------------------------------------------
ACTOR Peasant1 : Peasant 3004
{
Game Strife
ConversationID 6
Speed 4
}
ACTOR Peasant2 : Peasant 130
{
Game Strife
ConversationID 7
Speed 5
}
ACTOR Peasant3 : Peasant 131
{
Game Strife
ConversationID 8
Speed 5
}
ACTOR Peasant4 : Peasant 65
{
Game Strife
Translation 0
ConversationID 9
Speed 7
}
ACTOR Peasant5 : Peasant 132
{
Game Strife
Translation 0
ConversationID 10
Speed 7
}
ACTOR Peasant6 : Peasant 133
{
Game Strife
Translation 0
ConversationID 11
Speed 7
}
ACTOR Peasant7 : Peasant 66
{
Game Strife
Translation 2
ConversationID 12
}
ACTOR Peasant8 : Peasant 134
{
Game Strife
Translation 2
ConversationID 13
}
ACTOR Peasant9 : Peasant 135
{
Game Strife
Translation 2
ConversationID 14
}
ACTOR Peasant10 : Peasant 67
{
Game Strife
Translation 1
ConversationID 15
}
ACTOR Peasant11 : Peasant 136
{
Game Strife
Translation 1
ConversationID 16
}
ACTOR Peasant12 : Peasant 137
{
Game Strife
Translation 1
ConversationID 17
}
ACTOR Peasant13 : Peasant 172
{
Game Strife
Translation 3
ConversationID 18
}
ACTOR Peasant14 : Peasant 173
{
Game Strife
Translation 3
ConversationID 19
}
ACTOR Peasant15 : Peasant 174
{
Game Strife
Translation 3
ConversationID 20
}
ACTOR Peasant16 : Peasant 175
{
Game Strife
Translation 5
ConversationID 21
}
ACTOR Peasant17 : Peasant 176
{
Game Strife
Translation 5
ConversationID 22
}
ACTOR Peasant18 : Peasant 177
{
Game Strife
Translation 5
ConversationID 23
}
ACTOR Peasant19 : Peasant 178
{
Game Strife
Translation 4
ConversationID 24
}
ACTOR Peasant20 : Peasant 179
{
Game Strife
Translation 4
ConversationID 25
}
ACTOR Peasant21 : Peasant 180
{
Game Strife
Translation 4
ConversationID 26
}
ACTOR Peasant22 : Peasant 181
{
Game Strife
Translation 6
ConversationID 27
}

View file

@ -0,0 +1,206 @@
/*
* Quest Item Usage:
*
* 1 You got Beldin's ring
* 2 You got the Chalice
* 3 You got 300 gold, so it's time to visit Irale and the governor
* 4 Accepted the governor's power coupling mission
* 5 Accepted the governor's mission to kill Derwin
* 6 You broke the Front's power coupling
* 7 You took out the scanning team
* 8 You got the broken power coupling
* 9 You got the ear
* 10 You got the prison pass
* 11 You got the prison key
* 12 You got the severed hand
* 13 You've freed the prisoners!
* 14 You've Blown Up the Crystal
* 15 You got the guard uniform
* 16 You've Blown Up the Gates (/Piston)
* 17 You watched the Sigil slideshow on map10
* 18 You got the Oracle pass
* 19 You met Quincy and talked to him about the Bishop
* 20
* 21 You Killed the Bishop!
* 22 The Oracle has told you to kill Macil
* 23 You've Killed The Oracle!
* 24 You Killed Macil!
* 25 You've destroyed the Converter!
* 26 You've Killed The Loremaster!
* 27 You've Blown Up the Computer
* 28 You got the catacomb key
* 29 You destroyed the mind control device in the mines
* 30
* 31
*/
ACTOR QuestItem : Inventory
{
States
{
Spawn:
TOKN A -1
Stop
}
}
// Quest Items -------------------------------------------------------------
ACTOR QuestItem1 : QuestItem
{
ConversationID 312, 293, 310
}
ACTOR QuestItem2 : QuestItem
{
ConversationID 313, 294, 311
}
ACTOR QuestItem3 : QuestItem
{
ConversationID 314, 295, 312
}
ACTOR QuestItem4 : QuestItem
{
ConversationID 315, 296, 313
Tag "quest4"
}
ACTOR QuestItem5 : QuestItem
{
ConversationID 316, 297, 314
Tag "quest5"
}
ACTOR QuestItem6 : QuestItem
{
ConversationID 317, 298, 315
Tag "quest4"
}
ACTOR QuestItem7 : QuestItem
{
ConversationID 318, -1, -1
}
ACTOR QuestItem8 : QuestItem
{
ConversationID 319, -1, -1
}
ACTOR QuestItem9 : QuestItem
{
ConversationID 320, -1, -1
}
ACTOR QuestItem10 : QuestItem
{
ConversationID 321, -1, -1
}
ACTOR QuestItem11 : QuestItem
{
ConversationID 322, -1, -1
}
ACTOR QuestItem12 : QuestItem
{
ConversationID 323, -1, -1
}
ACTOR QuestItem13 : QuestItem
{
ConversationID 324, -1, -1
}
ACTOR QuestItem14 : QuestItem
{
ConversationID 325, -1, -1
}
ACTOR QuestItem15 : QuestItem
{
ConversationID 326, -1, -1
}
ACTOR QuestItem16 : QuestItem
{
ConversationID 327, -1, -1
}
ACTOR QuestItem17 : QuestItem
{
ConversationID 328, -1, -1
}
ACTOR QuestItem18 : QuestItem
{
ConversationID 329, -1, -1
}
ACTOR QuestItem19 : QuestItem
{
ConversationID 330, -1, -1
}
ACTOR QuestItem20 : QuestItem
{
ConversationID 331, -1, -1
}
ACTOR QuestItem21 : QuestItem
{
ConversationID 332, -1, -1
}
ACTOR QuestItem22 : QuestItem
{
ConversationID 333, -1, -1
}
ACTOR QuestItem23 : QuestItem
{
ConversationID 334, -1, -1
}
ACTOR QuestItem24 : QuestItem
{
ConversationID 335, -1, -1
}
ACTOR QuestItem25 : QuestItem
{
ConversationID 336, -1, -1
}
ACTOR QuestItem26 : QuestItem
{
ConversationID 337, -1, -1
}
ACTOR QuestItem27 : QuestItem
{
ConversationID 338, -1, -1
}
ACTOR QuestItem28 : QuestItem
{
ConversationID 339, -1, -1
}
ACTOR QuestItem29 : QuestItem
{
ConversationID 340, -1, -1
}
ACTOR QuestItem30 : QuestItem
{
ConversationID 341, -1, -1
}
ACTOR QuestItem31 : QuestItem
{
ConversationID 342, -1, -1
}

View file

@ -0,0 +1,37 @@
ACTOR RatBuddy 85
{
Game Strife
ConversationID 202, 196, 200
Health 5
Speed 13
Radius 10
Height 16
+SHOOTABLE
+NOBLOOD +FLOORCLIP +CANPASS
+ISMONSTER +INCOMBAT
MinMissileChance 150
MaxStepHeight 16
MaxDropoffHeight 32
Tag "rat_buddy"
SeeSound "rat/sight"
DeathSound "rat/death"
ActiveSound "rat/active"
States
{
Spawn:
RATT A 10 A_Look
Loop
See:
RATT AABB 4 A_Chase
Loop
Melee:
RATT A 8 A_Wander
RATT B 4 A_Wander
Goto See
Death:
MEAT Q 700
Stop
}
}

View file

@ -0,0 +1,49 @@
ACTOR MetalArmor : BasicArmorPickup 2019
{
Game Strife
SpawnID 69
ConversationID 129, 125, 128
Radius 20
Height 16
+FLOORCLIP
+INVENTORY.AUTOACTIVATE
+INVENTORY.INVBAR
Inventory.MaxAmount 3
Inventory.Icon "I_ARM1"
Inventory.PickupMessage "$TXT_METALARMOR"
Armor.SaveAmount 200
Armor.SavePercent 50
Tag "Metal_Armor"
States
{
Spawn:
ARM3 A -1
Stop
}
}
ACTOR LeatherArmor : BasicArmorPickup 2018
{
Game Strife
SpawnID 68
ConversationID 130, 126, 129
Radius 20
Height 16
+FLOORCLIP
+INVENTORY.AUTOACTIVATE
+INVENTORY.INVBAR
Inventory.MaxAmount 5
Inventory.Icon "I_ARM2"
Inventory.PickupMessage "$TXT_LEATHERARMOR"
Armor.SaveAmount 100
Armor.SavePercent 33.33333
Tag "Leather_Armor"
States
{
Spawn:
ARM4 A -1
Stop
}
}

View file

@ -0,0 +1,335 @@
// Med patch -----------------------------------------------------------------
ACTOR MedPatch : HealthPickup 2011
{
Game Strife
ConversationID 125, 121, 124
Health 10
+FLOORCLIP
+INVENTORY.INVBAR
Inventory.MaxAmount 20
Tag "Med_patch"
Inventory.Icon "I_STMP"
Inventory.PickupMessage "$TXT_MEDPATCH"
States
{
Spawn:
STMP A -1
Stop
}
}
// Medical Kit ---------------------------------------------------------------
ACTOR MedicalKit : HealthPickup 2012
{
Game Strife
ConversationID 126, 122, 125
Health 25
+FLOORCLIP
+INVENTORY.INVBAR
Inventory.MaxAmount 15
Tag "Medical_kit"
Inventory.Icon "I_MDKT"
Inventory.PickupMessage "$TXT_MEDICALKIT"
States
{
Spawn:
MDKT A -1
Stop
}
}
// Surgery Kit --------------------------------------------------------------
ACTOR SurgeryKit : HealthPickup 83
{
Game Strife
ConversationID 127, 123, 126
+FLOORCLIP
+INVENTORY.INVBAR
Health -100
Inventory.MaxAmount 5
Tag "Surgery_Kit" // "full_health" in the Teaser
Inventory.Icon "I_FULL"
Inventory.PickupMessage "$TXT_SURGERYKIT"
States
{
Spawn:
FULL AB 35
Loop
}
}
// StrifeMap ----------------------------------------------------------------
ACTOR StrifeMap : MapRevealer 2026
{
Game Strife
SpawnID 137
ConversationID 164, 160, 163
+FLOORCLIP
Inventory.PickupSound "misc/p_pkup"
Inventory.PickupMessage "$TXT_STRIFEMAP"
States
{
Spawn:
SMAP AB 6 Bright
Loop
}
}
// Beldin's Ring ------------------------------------------------------------
ACTOR BeldinsRing : Inventory
{
Game Strife
+NOTDMATCH
+FLOORCLIP
+INVENTORY.INVBAR
ConversationID 173, 165, 169
Tag "ring"
Inventory.Icon "I_RING"
Inventory.GiveQuest 1
Inventory.PickupMessage "$TXT_BELDINSRING"
States
{
Spawn:
RING A -1
Stop
}
}
// Offering Chalice ---------------------------------------------------------
ACTOR OfferingChalice : Inventory 205
{
Game Strife
+DROPPED
+FLOORCLIP
+INVENTORY.INVBAR
ConversationID 174, 166, 170
Radius 10
Height 16
Tag "Offering_Chalice"
Inventory.Icon "I_RELC"
Inventory.PickupMessage "$TXT_OFFERINGCHALICE"
Inventory.GiveQuest 2
States
{
Spawn:
RELC A -1
Stop
}
}
// Ear ----------------------------------------------------------------------
ACTOR Ear : Inventory
{
Game Strife
+FLOORCLIP
+INVENTORY.INVBAR
ConversationID 175, 167, 171
Tag "ear"
Inventory.Icon "I_EARS"
Inventory.PickupMessage "$TXT_EAR"
Inventory.GiveQuest 9
States
{
Spawn:
EARS A -1
Stop
}
}
// Broken Power Coupling ----------------------------------------------------
ACTOR BrokenPowerCoupling : Inventory 226
{
Game Strife
ConversationID 289, -1, -1
Health 40
+DROPPED
+FLOORCLIP
+INVENTORY.INVBAR
Radius 16
Height 16
Tag "BROKEN_POWER_COUPLING"
Inventory.MaxAmount 1
Inventory.Icon "I_COUP"
Inventory.PickupMessage "$TXT_BROKENCOUPLING"
Inventory.GiveQuest 8
States
{
Spawn:
COUP C -1
Stop
}
}
// Shadow Armor -------------------------------------------------------------
ACTOR ShadowArmor : PowerupGiver 2024
{
Game Strife
SpawnID 135
ConversationID 160, 156, 159
+FLOORCLIP
+VISIBILITYPULSE
+INVENTORY.INVBAR
-INVENTORY.FANCYPICKUPSOUND
RenderStyle Translucent
Tag "Shadow_armor"
Inventory.MaxAmount 2
Powerup.Type "Shadow"
Inventory.Icon "I_SHD1"
Inventory.PickupSound "misc/i_pkup"
Inventory.PickupMessage "$TXT_SHADOWARMOR"
States
{
Spawn:
SHD1 A -1 Bright
Stop
}
}
// Environmental suit -------------------------------------------------------
ACTOR EnvironmentalSuit : PowerupGiver 2025
{
Game Strife
SpawnID 136
ConversationID 161, 157, 160
+FLOORCLIP
+INVENTORY.INVBAR
-INVENTORY.FANCYPICKUPSOUND
Inventory.MaxAmount 5
Powerup.Type "Mask"
Tag "Environmental_Suit"
Inventory.Icon "I_MASK"
Inventory.PickupSound "misc/i_pkup"
Inventory.PickupMessage "$TXT_ENVSUIT"
States
{
Spawn:
MASK A -1
Stop
}
}
// Guard Uniform ------------------------------------------------------------
ACTOR GuardUniform : Inventory 90
{
Game Strife
ConversationID 162, 158, 161
+FLOORCLIP
+INVENTORY.INVBAR
Tag "Guard_Uniform"
Inventory.Icon "I_UNIF"
Inventory.PickupMessage "$TXT_GUARDUNIFORM"
Inventory.GiveQuest 15
States
{
Spawn:
UNIF A -1
Stop
}
}
// Officer's Uniform --------------------------------------------------------
ACTOR OfficersUniform : Inventory 52
{
Game Strife
ConversationID 163, 159, 162
+FLOORCLIP
+INVENTORY.INVBAR
Tag "Officer's_Uniform"
Inventory.Icon "I_OFIC"
Inventory.PickupMessage "$TXT_OFFICERSUNIFORM"
States
{
Spawn:
OFIC A -1
Stop
}
}
// InterrogatorReport -------------------------------------------------------
// SCRIPT32 in strife0.wad has an Acolyte that drops this, but I couldn't
// find that Acolyte in the map. It seems to be totally unused in the
// final game.
ACTOR InterrogatorReport : Inventory
{
Game Strife
ConversationID 308, 289, 306
+FLOORCLIP
Tag "report"
Inventory.PickupMessage "$TXT_REPORT"
States
{
Spawn:
TOKN A -1
Stop
}
}
// Info ---------------------------------------------------------------------
ACTOR Info : Inventory
{
Game Strife
ConversationID 300, 282, 299
+FLOORCLIP
+INVENTORY.INVBAR
Tag "info"
Inventory.Icon "I_TOKN"
Inventory.PickupMessage "$TXT_INFO"
States
{
Spawn:
TOKN A -1
Stop
}
}
// Targeter -----------------------------------------------------------------
ACTOR Targeter : PowerupGiver 207
{
Game Strife
ConversationID 167, 169, 173
+FLOORCLIP
+INVENTORY.INVBAR
-INVENTORY.FANCYPICKUPSOUND
Tag "Targeter"
Powerup.Type "Targeter"
Inventory.MaxAmount 5
Inventory.Icon "I_TARG"
Inventory.PickupSound "misc/i_pkup"
Inventory.PickupMessage "$TXT_TARGETER"
States
{
Spawn:
TARG A -1
Stop
}
}

View file

@ -0,0 +1,516 @@
ACTOR StrifeKey : Key
{
Radius 20
Height 16
+NOTDMATCH
+FLOORCLIP
}
// Base Key -----------------------------------------------------------------
ACTOR BaseKey : StrifeKey 230
{
Game Strife
ConversationID 133, 129, 132
Inventory.Icon "I_FUSL"
Tag "Base_Key"
Inventory.PickupMessage "$TXT_BASEKEY"
States
{
Spawn:
FUSL A -1
Stop
}
}
// Govs Key -----------------------------------------------------------------
ACTOR GovsKey : StrifeKey
{
Game Strife
ConversationID 134, 130, 133
Inventory.Icon "I_REBL"
Tag "Govs_Key" // "Rebel_Key" in the Teaser
Inventory.PickupMessage "$TXT_GOVSKEY"
States
{
Spawn:
REBL A -1
Stop
}
}
// Passcard -----------------------------------------------------------------
ACTOR Passcard : StrifeKey 185
{
Game Strife
ConversationID 135, 131, 134
Inventory.Icon "I_TPAS"
Tag "Passcard"
Inventory.PickupMessage "$TXT_PASSCARD"
States
{
Spawn:
TPAS A -1
Stop
}
}
// ID Badge -----------------------------------------------------------------
ACTOR IDBadge : StrifeKey 184
{
Game Strife
ConversationID 136, 132, 135
Inventory.Icon "I_CRD1"
Tag "ID_Badge"
Inventory.PickupMessage "$TXT_IDBADGE"
States
{
Spawn:
CRD1 A -1
Stop
}
}
// Prison Key ---------------------------------------------------------------
ACTOR PrisonKey : StrifeKey
{
Game Strife
ConversationID 137, 133, 136
Inventory.Icon "I_PRIS"
Tag "Prison_Key"
Inventory.GiveQuest 11
Inventory.PickupMessage "$TXT_PRISONKEY"
States
{
Spawn:
PRIS A -1
Stop
}
}
// Severed Hand -------------------------------------------------------------
ACTOR SeveredHand : StrifeKey 91
{
Game Strife
ConversationID 138, 134, 137
Inventory.Icon "I_HAND"
Tag "Severed_Hand"
Inventory.GiveQuest 12
Inventory.PickupMessage "$TXT_SEVEREDHAND"
States
{
Spawn:
HAND A -1
Stop
}
}
// Power1 Key ---------------------------------------------------------------
ACTOR Power1Key : StrifeKey
{
Game Strife
ConversationID 139, 135, 138
Inventory.Icon "I_PWR1"
Tag "Power1_Key"
Inventory.PickupMessage "$TXT_POWER1KEY"
States
{
Spawn:
PWR1 A -1
Stop
}
}
// Power2 Key ---------------------------------------------------------------
ACTOR Power2Key : StrifeKey
{
Game Strife
ConversationID 140, 136, 139
Inventory.Icon "I_PWR2"
Tag "Power2_Key"
Inventory.PickupMessage "$TXT_POWER2KEY"
States
{
Spawn:
PWR2 A -1
Stop
}
}
// Power3 Key ---------------------------------------------------------------
ACTOR Power3Key : StrifeKey
{
Game Strife
ConversationID 141, 137, 140
Inventory.Icon "I_PWR3"
Tag "Power3_Key"
Inventory.PickupMessage "$TXT_POWER3KEY"
States
{
Spawn:
PWR3 A -1
Stop
}
}
// Gold Key -----------------------------------------------------------------
ACTOR GoldKey : StrifeKey 40
{
Game Strife
ConversationID 142, 138, 141
Inventory.Icon "I_KY1G"
Tag "Gold_Key"
Inventory.PickupMessage "$TXT_GOLDKEY"
States
{
Spawn:
KY1G A -1
Stop
}
}
// ID Card ------------------------------------------------------------------
ACTOR IDCard : StrifeKey 13
{
Game Strife
ConversationID 143, 139, 142
Inventory.Icon "I_CRD2"
Tag "ID_Card"
Inventory.PickupMessage "$TXT_IDCARD"
States
{
Spawn:
CRD2 A -1
Stop
}
}
// Silver Key ---------------------------------------------------------------
ACTOR SilverKey : StrifeKey 38
{
Game Strife
ConversationID 144, 140, 143
Inventory.Icon "I_KY2S"
Tag "Silver_Key"
Inventory.PickupMessage "$TXT_SILVERKEY"
States
{
Spawn:
KY2S A -1
Stop
}
}
// Oracle Key ---------------------------------------------------------------
ACTOR OracleKey : StrifeKey 61
{
Game Strife
ConversationID 145, 141, 144
Inventory.Icon "I_ORAC"
Tag "Oracle_Key"
Inventory.PickupMessage "$TXT_ORACLEKEY"
States
{
Spawn:
ORAC A -1
Stop
}
}
// Military ID --------------------------------------------------------------
ACTOR MilitaryID : StrifeKey
{
Game Strife
ConversationID 146, 142, 145
Inventory.Icon "I_GYID"
Tag "Military ID"
Inventory.PickupMessage "$TXT_MILITARYID"
States
{
Spawn:
GYID A -1
Stop
}
}
// Order Key ----------------------------------------------------------------
ACTOR OrderKey : StrifeKey 86
{
Game Strife
ConversationID 147, 143, 146
Inventory.Icon "I_FUBR"
Tag "Order_Key"
Inventory.PickupMessage "$TXT_ORDERKEY"
States
{
Spawn:
FUBR A -1
Stop
}
}
// Warehouse Key ------------------------------------------------------------
ACTOR WarehouseKey : StrifeKey 166
{
Game Strife
ConversationID 148, 144, 147
Inventory.Icon "I_WARE"
Tag "Warehouse_Key"
Inventory.PickupMessage "$TXT_WAREHOUSEKEY"
States
{
Spawn:
WARE A -1
Stop
}
}
// Brass Key ----------------------------------------------------------------
ACTOR BrassKey : StrifeKey 39
{
Game Strife
ConversationID 149, 145, 148
Inventory.Icon "I_KY3B"
Tag "Brass_Key"
Inventory.PickupMessage "$TXT_BRASSKEY"
States
{
Spawn:
KY3B A -1
Stop
}
}
// Red Crystal Key ----------------------------------------------------------
ACTOR RedCrystalKey : StrifeKey 192
{
Game Strife
ConversationID 150, 146, 149
Inventory.Icon "I_RCRY"
Tag "Red_Crystal_Key"
Inventory.PickupMessage "$TXT_REDCRYSTAL"
States
{
Spawn:
RCRY A -1 Bright
Stop
}
}
// Blue Crystal Key ---------------------------------------------------------
ACTOR BlueCrystalKey : StrifeKey 193
{
Game Strife
ConversationID 151, 147, 150
Inventory.Icon "I_BCRY"
Tag "Blue_Crystal_Key"
Inventory.PickupMessage "$TXT_BLUECRYSTAL"
States
{
Spawn:
BCRY A -1 Bright
Stop
}
}
// Chapel Key ---------------------------------------------------------------
ACTOR ChapelKey : StrifeKey 195
{
Game Strife
ConversationID 152, 148, 151
Inventory.Icon "I_CHAP"
Tag "Chapel_Key"
Inventory.PickupMessage "$TXT_CHAPELKEY"
States
{
Spawn:
CHAP A -1
Stop
}
}
// Catacomb Key -------------------------------------------------------------
ACTOR CatacombKey : StrifeKey
{
Game Strife
ConversationID 153, 149, 152
Inventory.Icon "I_TUNL"
Tag "Catacomb_Key" // "Tunnel_Key" in the Teaser
Inventory.GiveQuest 28
Inventory.PickupMessage "$TXT_CATACOMBKEY"
States
{
Spawn:
TUNL A -1
Stop
}
}
// Security Key -------------------------------------------------------------
ACTOR SecurityKey : StrifeKey
{
Game Strife
ConversationID 154, 150, 153
Inventory.Icon "I_SECK"
Tag "Security_Key"
Inventory.PickupMessage "$TXT_SECURITYKEY"
States
{
Spawn:
SECK A -1
Stop
}
}
// Core Key -----------------------------------------------------------------
ACTOR CoreKey : StrifeKey 236
{
Game Strife
ConversationID 155, 151, 154
Inventory.Icon "I_GOID"
Tag "Core_Key" // "New_Key1" in the Teaser
Inventory.PickupMessage "$TXT_COREKEY"
States
{
Spawn:
GOID A -1
Stop
}
}
// Mauler Key ---------------------------------------------------------------
ACTOR MaulerKey : StrifeKey 233
{
Game Strife
ConversationID 156, 152, 155
Inventory.Icon "I_BLTK"
Tag "Mauler_Key" // "New_Key2" in the Teaser
Inventory.PickupMessage "$TXT_MAULERKEY"
States
{
Spawn:
BLTK A -1
Stop
}
}
// Factory Key --------------------------------------------------------------
ACTOR FactoryKey : StrifeKey 234
{
Game Strife
ConversationID 157, 153, 156
Inventory.Icon "I_PROC"
Tag "Factory_Key" // "New_Key3" in the Teaser
Inventory.PickupMessage "$TXT_FACTORYKEY"
States
{
Spawn:
PROC A -1
Stop
}
}
// Mine Key -----------------------------------------------------------------
ACTOR MineKey : StrifeKey 235
{
Game Strife
ConversationID 158, 154, 157
Inventory.Icon "I_MINE" // "New_Key4" in the Teaser
Tag "MINE_KEY"
Inventory.PickupMessage "$TXT_MINEKEY"
States
{
Spawn:
MINE A -1
Stop
}
}
// New Key5 -----------------------------------------------------------------
ACTOR NewKey5 : StrifeKey
{
Game Strife
ConversationID 159, 155, 158
Inventory.Icon "I_BLTK"
Tag "New_Key5"
Inventory.PickupMessage "$TXT_NEWKEY5"
States
{
Spawn:
BLTK A -1
Stop
}
}
// Oracle Pass --------------------------------------------------------------
ACTOR OraclePass : Inventory
{
Game Strife
ConversationID 311, 292, 309
+INVENTORY.INVBAR
Inventory.Icon "I_OTOK"
Inventory.GiveQuest 18
Inventory.PickupMessage "$TXT_ORACLEPASS"
Tag "Oracle_Pass"
States
{
Spawn:
OTOK A -1
Stop
}
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,61 @@
// Zombie -------------------------------------------------------------------
ACTOR Zombie : StrifeHumanoid 169
{
Game Strife
Health 31
Radius 20
Height 56
PainChance 0
+SOLID
+SHOOTABLE
+FLOORCLIP
+CANPASS
+CANPUSHWALLS
+ACTIVATEMCROSS
MinMissileChance 150
MaxStepHeight 16
MaxDropOffHeight 32
Translation 0
ConversationID 28, -1, -1
DeathSound "zombie/death"
States
{
Spawn:
PEAS A 5 A_CheckTerrain
Loop
Pain:
AGRD A 5 A_CheckTerrain
Loop
Death:
GIBS M 5 A_TossGib
GIBS N 5 A_XScream
GIBS O 5 A_NoBlocking
GIBS PQRST 4 A_TossGib
GIBS U 5
GIBS V 1400
Stop
}
}
// Zombie Spawner -----------------------------------------------------------
ACTOR ZombieSpawner 170
{
Game Strife
Health 20
+SHOOTABLE
+NOSECTOR
RenderStyle None
ConversationID 30, -1, -1
ActiveSound "zombie/spawner" // Does Strife use this somewhere else?
States
{
Spawn:
TNT1 A 175 A_SpawnItem("Zombie", 0.1, 0)
Loop
}
}

View file

@ -986,6 +986,66 @@ TXT_NEED_BRASSKEY = "You need the Brass Key";
TXT_NEED_REDCRYSTAL = "You need the Red Crystal"; TXT_NEED_REDCRYSTAL = "You need the Red Crystal";
TXT_NEED_BLUECRYSTAL = "You need the Blue Crystal"; TXT_NEED_BLUECRYSTAL = "You need the Blue Crystal";
// Strife Quest messages
TXT_QUEST_14 = "You've Blown Up the Crystal";
TXT_QUEST_16 = "You've Blown Up the Gates";
TXT_QUEST_27 = "You've Blown Up the Computer";
TXT_KILLED_BISHOP = "You Killed The Bishop!";
TXT_KILLED_ORACLE = "You've Killed The Oracle!";
TXT_KILLED_MACIL = "You Killed Macil!";
TXT_KILLED_LOREMASTER = "You've Killed the Loremaster!";
// Strife pickup messages
TXT_METALARMOR = "You picked up the Metal Armor.";
TXT_LEATHERARMOR = "You picked up the Leather Armor.";
TXT_MEDPATCH = "You picked up the Med patch.";
TXT_MEDICALKIT = "You picked up the Medical kit.";
TXT_SURGERYKIT = "You picked up the Surgery Kit.";
TXT_STRIFEMAP = "You picked up the map";
TXT_BELDINSRING = "You picked up the ring.";
TXT_OFFERINGCHALICE = "You picked up the Offering Chalice.";
TXT_EAR = "You picked up the ear.";
TXT_BROKENCOUPLING = "You picked up the broken power coupling.";
TXT_SHADOWARMOR = "You picked up the Shadow armor.";
TXT_ENVSUIT = "You picked up the Environmental Suit.";
TXT_GUARDUNIFORM = "You picked up the Guard Uniform.";
TXT_OFFICERSUNIFORM = "You picked up the Officer's Uniform.";
TXT_REPORT = "You picked up the report.";
TXT_INFO = "You picked up the info.";
TXT_TARGETER = "You picked up the Targeter.";
TXT_BASEKEY = "You picked up the Base Key.";
TXT_GOVSKEY = "You picked up the Govs Key.";
TXT_PASSCARD = "You picked up the Passcard.";
TXT_IDBADGE = "You picked up the ID Badge.";
TXT_PRISONKEY = "You picked up the Prison Key.";
TXT_SEVEREDHAND = "You picked up the Severed Hand.";
TXT_POWER1KEY = "You picked up the Power1 Key.";
TXT_POWER2KEY = "You picked up the Power2 Key.";
TXT_POWER3KEY = "You picked up the Power3 Key.";
TXT_GOLDKEY = "You picked up the Gold Key.";
TXT_IDCARD = "You picked up the ID Card.";
TXT_SILVERKEY = "You picked up the Silver Key.";
TXT_ORACLEKEY = "You picked up the Oracle Key.";
TXT_MILITARYID = "You picked up the Military ID.";
TXT_ORDERKEY = "You picked up the Order Key.";
TXT_WAREHOUSEKEY = "You picked up the Warehouse Key.";
TXT_BRASSKEY = "You picked up the Brass Key.";
TXT_REDCRYSTAL = "You picked up the Red Crystal Key.";
TXT_BLUECRYSTAL = "You picked up the Blue Crystal Key.";
TXT_CHAPELKEY = "You picked up the Chapel Key.";
TXT_CATACOMBKEY = "You picked up the Catacomb Key.";
TXT_SECURITYKEY = "You picked up the Security Key.";
TXT_COREKEY = "You picked up the Core Key.";
TXT_MAULERKEY = "You picked up the Mauler Key.";
TXT_FACTORYKEY = "You picked up the Factory Key.";
TXT_MINEKEY = "You picked up the Mine Key.";
TXT_NEWKEY5 = "You picked up the New Key5.";
TXT_ORACLEPASS = "You picked up the Oracle Pass.";
// Bloodbath announcer // Bloodbath announcer
BBA_BONED = "%k boned %o like a fish"; BBA_BONED = "%k boned %o like a fish";

View file

@ -548,6 +548,16 @@ PD_ANY = "Una chiave qualunque aprira' questa porta";
PD_ALL3 = "Ti servono tutte e tre le chiavi per aprire questa porta"; PD_ALL3 = "Ti servono tutte e tre le chiavi per aprire questa porta";
PD_ALL6 = "Ti servono tutte e sei le chiavi per aprire questa porta"; PD_ALL6 = "Ti servono tutte e sei le chiavi per aprire questa porta";
PD_ALL3O = "Ti servono tutte e tre le chiavi per attivare questo oggetto ";
PD_ALL6O = "Ti servono tutte e tre le chiavi per attivare questo oggetto ";
PD_BLUECO = "ti serve una tessera blu per attivare questo oggetto ";
PD_REDCO = "ti serve una tessera rossa per attivare questo oggetto ";
PD_YELLOWCO = "ti serve una tessera gialla per attivare questo oggetto ";
PD_BLUESO = "ti serve una chiave-teschio blu per attivare questo oggetto ";
PD_REDSO = "ti serve una chiave-teschio rossa per attivare questo oggetto ";
PD_YELLOWSO = "ti serve una chiave-teschio gialla per attivare questo oggetto ";
// Gameflow messages // Gameflow messages
TXT_FRAGLIMIT = "Fraglimit raggiunto."; TXT_FRAGLIMIT = "Fraglimit raggiunto.";
TXT_TIMELIMIT = "Timelimit raggiunto."; TXT_TIMELIMIT = "Timelimit raggiunto.";

View file

@ -301,6 +301,39 @@
<Filter <Filter
Name="Strife" Name="Strife"
Filter=""> Filter="">
<File
RelativePath=".\decorate\strife\beggars.txt">
</File>
<File
RelativePath=".\decorate\strife\merchants.txt">
</File>
<File
RelativePath=".\decorate\strife\peasants.txt">
</File>
<File
RelativePath=".\decorate\strife\questitems.txt">
</File>
<File
RelativePath=".\decorate\strife\ratbuddy.txt">
</File>
<File
RelativePath=".\decorate\strife\rebels.txt">
</File>
<File
RelativePath=".\decorate\strife\strifearmor.txt">
</File>
<File
RelativePath=".\decorate\strife\strifeitems.txt">
</File>
<File
RelativePath=".\decorate\strife\strifekeys.txt">
</File>
<File
RelativePath=".\decorate\strife\strifestuff.txt">
</File>
<File
RelativePath=".\decorate\strife\zombie.txt">
</File>
</Filter> </Filter>
<Filter <Filter
Name="Raven" Name="Raven"

View file

@ -209,3 +209,15 @@ actors/hexen/hexenspecialdecs.txt decorate/hexen/hexenspecialdecs.txt
actors/hexen/puzzleitems.txt decorate/hexen/puzzleitems.txt actors/hexen/puzzleitems.txt decorate/hexen/puzzleitems.txt
actors/hexen/scriptprojectiles.txt decorate/hexen/scriptprojectiles.txt actors/hexen/scriptprojectiles.txt decorate/hexen/scriptprojectiles.txt
actors/hexen/speedboots.txt decorate/hexen/speedboots.txt actors/hexen/speedboots.txt decorate/hexen/speedboots.txt
actors/strife/beggars.txt decorate/strife/beggars.txt
actors/strife/merchants.txt decorate/strife/merchants.txt
actors/strife/peasants.txt decorate/strife/peasants.txt
actors/strife/questitems.txt decorate/strife/questitems.txt
actors/strife/ratbuddy.txt decorate/strife/ratbuddy.txt
actors/strife/strifearmor.txt decorate/strife/strifearmor.txt
actors/strife/strifeitems.txt decorate/strife/strifeitems.txt
actors/strife/strifekeys.txt decorate/strife/strifekeys.txt
actors/strife/strifestuff.txt decorate/strife/strifestuff.txt
actors/strife/zombie.txt decorate/strife/zombie.txt

View file

@ -3903,21 +3903,6 @@
AdditionalOptions="&quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; "/> AdditionalOptions="&quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; "/>
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath=".\src\g_hexen\a_scriptprojectiles.cpp">
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="&quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; "/>
</FileConfiguration>
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="&quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; &quot; /I /fmod/api/inc&quot; "/>
</FileConfiguration>
</File>
<File <File
RelativePath=".\src\g_hexen\a_serpent.cpp"> RelativePath=".\src\g_hexen\a_serpent.cpp">
<FileConfiguration <FileConfiguration
@ -4042,12 +4027,6 @@
<File <File
RelativePath=".\src\g_strife\a_programmer.cpp"> RelativePath=".\src\g_strife\a_programmer.cpp">
</File> </File>
<File
RelativePath=".\src\g_strife\a_questitems.cpp">
</File>
<File
RelativePath=".\src\g_strife\a_ratbuddy.cpp">
</File>
<File <File
RelativePath=".\src\g_strife\a_reaver.cpp"> RelativePath=".\src\g_strife\a_reaver.cpp">
</File> </File>
@ -4066,9 +4045,6 @@
<File <File
RelativePath=".\src\g_strife\a_strifeammo.cpp"> RelativePath=".\src\g_strife\a_strifeammo.cpp">
</File> </File>
<File
RelativePath=".\src\g_strife\a_strifearmor.cpp">
</File>
<File <File
RelativePath=".\src\g_strife\a_strifebishop.cpp"> RelativePath=".\src\g_strife\a_strifebishop.cpp">
</File> </File>
@ -4078,9 +4054,6 @@
<File <File
RelativePath=".\src\g_strife\a_strifeitems.cpp"> RelativePath=".\src\g_strife\a_strifeitems.cpp">
</File> </File>
<File
RelativePath=".\src\g_strife\a_strifekeys.cpp">
</File>
<File <File
RelativePath=".\src\g_strife\a_strifeplayer.cpp"> RelativePath=".\src\g_strife\a_strifeplayer.cpp">
</File> </File>
@ -4105,9 +4078,6 @@
<File <File
RelativePath=".\src\g_strife\a_thingstoblowup.cpp"> RelativePath=".\src\g_strife\a_thingstoblowup.cpp">
</File> </File>
<File
RelativePath=".\src\g_strife\a_zombie.cpp">
</File>
<File <File
RelativePath=".\src\g_strife\strife_sbar.cpp"> RelativePath=".\src\g_strife\strife_sbar.cpp">
</File> </File>