==============================================================================

Title        : AD v1.42P2 - (Arcane Dimensions Patch 2)
Date         : 31th January 2016
MOD Team     : Simon OCallaghan - Art, Code and Level Design
             : Maik Franz Xaver - Art and Level Design
             : Corey Jones - Animation and Code Support
             : Matthew Breit - Animation, Art, Code Support and Level Design
             : Sean Campbell, Gavin Edgington, Noel Lacaillade - Level Design
             : Eric Wasylishen - LD Compiler Support and Level Design
             : Andrew Denner - Art, Compiler tools and Code Support
			 
Additional   : Bengt Jardrup for WinQuake support and Code Support
thanks       : John Fitzgibbons for Rubicon2 Art assets and Code functions
             : Louis Manning for RRP/RMQ Art assets and Code functions
             : Sign of Kell for Quoth Art assets			 

Please note  : This is an alternative universe of Quake, many assets and
             : features have changed, even though it may look the same in 
             : places this code base and assets are very much different.
			 
Shotguns     : All of the shotguns have been changed to projectiles instead of
             : hitscan impact. If you don't like this change use impulse 130
             : to switch between either system or edit the quake.rc file.

Mappers      : The editor .def and .fgd files supplied with this MOD require
             : the worldspawn entity to have "no_item_offset" set to 1
			 
Name and QC  : Do not use the AD (Arcane Dimension) name for your own mod
             : All the QC files are included and covered under GPL
			 
Additional   : The majority of the textures are based on existing Quake assets
Compilers &  : BSP/VIS Compilers - by Kevin Shanahan/Eric Wasylishen
Dev tools    : Latest Version - ericwa.github.io/tyrutils-ericw/
             : Used by MFX - (www.voidspark.net/projects/bjptools_xt/)
             : TexMex 3.4 by Mike Jackman (organize textures)
             : AdQuedit 1.3 by Hicks Goldrush (updating skins)
             : QME 3.1 patch 2 by Rene Post (Change/update models)
             : Quake C FTEQCC Compiler (fte.triptohell.info/)

Engines      : The MOD is designed to work with the QuakeSpasm Engine
               Other engines offer partial support of features

* QuakeSpasm : Version 0.91.0 (Must use the latest version)
    - Download (http://quakespasm.sourceforge.net/download.htm)
	
* Darkplaces : Version 13 May 2014
    - Download (https://icculus.org/twilight/darkplaces/download.html)
	
* MarkV WinQ : Version 0.99 May 8 2015 (based on MarkV with retro settings)
    - Download (http://www.quakeone.com/proquake/interims/mark_v_20150508_windows.zip)

==============================================================================
V1.42 Patch 1 Notes
-------------------

* Added transparent texture support for DP
* Updated breakables for ad_crucial, ad_swampy, ad_test3
* Fixed ad_crucial so that the rune room does not lock
* Fixing bounding boxes for misc/func exploding boxes
* Removed FTE engine detection (simplified to DP/Fitz)
* Changed pixels command to understand default=blurry
* Added DP laser particle effect (TR_LASER)
* Removed EF_DIMLIGHT from plasma/laser for DP
* Added plasma burn explosion for DP (large cloud effect)
* Added altar (red/grey) DP (floating upward dots/smoke)
* Fixed skill pillar directional particles for DP
* changed misc_drip movetype to prevent engine splash sound
* Fixed extra global fog parameters for ad_end in DP
* Changed trigger_heal/hurt bubbles to be noclip instead of fly
* Fixed spiders/voreling dropping from ceiling properly in DP
* Gaunt projectile speed - old (600/600/600/600) new (500/650/800/950)
* Gargoyle projectile speed - old (500/550/600/650) new (500/650/800/950)
* Minotaur projectile speed - old (500/600/700/800) new (500/650/800/950)
* Ceiling spiders are broken with patch 1 for QuakeSpasm Engine

V1.42 Patch 2 Notes
-------------------

* Added two new remix maps (ad_e1m1 and ad_e2m2) to the start map
* Fixed sprite particle system reaching limit and not going back down
* Added new quake.rc option to stop all global fog command/functions working
* Updated various models in progs directory to work with winQuake clients
* Added think/nextthink reset to monster_death_precheck to stop animation errors
* Added think/nextthink reset to entity_hide to stop animation when hidden
* Fixed remove(self) code problems with _once, _multi, _hurt and misc_bubble
* Added variable (cnt) override for all item_artifacts expiration timers
* Client debuff pain sounds can be blocked by god/pentagram mode
* Moved lost souls death radius explosion to second death frame
* Added more enemy/health checks to crossbow knight attack functions
* Fixed ceiling spider/Voreling for QuakeSpasm and Darkplaces engines
* Spider and Voreling melee range changed from 50 to 60 (diagonal bbox problem)
* Pyro flame sprite movetype changed to fat missile type for monsters
* Pyro correctly aims flames at smaller targets and resets ricochet effect
* Changed zombies to die after 30s if blocked trying to get up off the floor
* Can now switch weapons (via keys 1-8) while firing (was locked before)
* Fury Knight triple rocket attack changed to 20 direct and 20 splash
* Soldier shotgun/rocket/plasma can now drop exact amounts of ammo
* Fixed zombie/knights idle sound not being blocked via spawnflag
* Fixed nomonstercount not being read properly when monster dies
* misc_builtineffects now plays any associated sounds on self or target
* Fixed misc_particle_burst particle count being reset after trigger
* item pickup triggers for weapons now fires once when playing co-op

==============================================================================
MOD Contents
------------

Installation                 : How to install the MOD and maps details
MOD settings                 : How to change the way the MOD works
New / Updated Entities       : Detail list of misc, func and trigger changes
Entity State System          : New ability to switch any entity on/off/disable
Starting Point               : Ways to enahance start/hub map layouts
Trains, Chains and Corners   : New train system and path corners
Traps, Tricks and Tips       : New traps and tricks to include in maps
Breakable System             : How to enhance/change a map environment
Particle System              : How to create/use pixel particles in maps
New/Updated Monsters         : Detailed look at all new monters and abilities
Minion System                : New minion spawning system for certain monsters
Bounding Boxes               : Large table showing all monster bounding boxes
New Weapons                  : Detailed look at new weapons and how they work
Weapon Upgrade Parameters    : How weapon upgrades are given/taken from players
Ammo Resistance              : Details on how and what is affected by resistance
MOD Features                 : Long bullet point list of all new features
MOD Resource Credits         : Detailed list of where all the assets came from


==============================================================================
Installation
------------

* Create a new folder called "ad" in your Quake folder
* Copy the Zip file into the new folder
* Extract the contents of the zip file
* Create a shortcut to your preferred Quake engine
* Add the following to the command line

 -heapsize 256000 -zone 4096 -game ad

* The above command line is only needed if engine runs really slow 
* Run the shortcut (click icon) and make sure the engine loads
* After the start map has loaded pick your skill level

MOD Maps
--------
* start        - Hodgepodge of themes and portals (Simon OCallaghan)
* ad_cruical   - Lava caves and industrial complex (Maik Franz Xaver)
* ad_dm1       - Place of Many Deaths (Gavin Edgington)
* ad_lavatomb  - Stone city gradually sinking into lava (Noel Lacaillade)
* ad_mountain  - Dark stone mountain prison (Simon OCallaghan)
* ad_necrokeep - The Necromancer Keep! (Sean Campbell/Matthew Breit)
* ad_obd       - A giant pile of neatly stacked bricks (Simon OCallaghan)
* ad_swampy    - Gigantic interconnected medieval town (Maik Franz Xaver)
* ad_end       - Final destination for AD travellers (Maik Franz Xaver)

Remix Maps
----------
* ad_dm5   - The Mire (Noel Lacaillade)
* ad_e1m1  - Hanger 16 (Sean Campbell)
* ad_e2m2  - Ogre Bastille (Simon OCallaghan)
* ad_e2m7  - The Underearth (Eric Wasylishen)

Test Maps
---------
* start_test - Round brick hub map with portals in all directions (SimonOC)
* ad_test1   - Breakables, new ambush surprises and monster reactions (SimonOC)
* ad_test2   - Egyptain blast from the past hanuted by Wraiths (SimonOC)
* ad_test3   - Hipnotic rotation; cogs, wheels and medieval fans! (MFX)
* ad_test4   - Small medieval courtyard with statues and Golems (SimonOC)
* ad_test5   - Large village square guarded by Minotaurs (SimonOC)
* ad_test6   - Tall medieval courtyard full of knights and ogres (SimonOC)
* ad_test7   - Multi level library full of teleporting skull wizards (SimonOC)
* ad_test8   - Giant runic room occupied by gaunts and droles (EricW)
* ad_test9   - Dark medieval chamber guarded by hammer ogres (EricW)
* ad_test10  - Plasma gun carnage in a giant brushwork box! (SimonOC)
* ad_test11  - Shooting range to test all projectile weapons (SimonOC)


==============================================================================
MOD settings
------------

There are several different places (RC/Map/Console) where the MOD settings can
be changed and some locations have precedent over others. The MOD will initially
look to the quake.rc file first, worldspawn second and finally the console
commands third. The higher levels will always override lower levels.

------------------------------------------------------------------------------
Level 1 - quake.rc
The first place where settings can be changed is the Quake.RC file which is
located in the root directory of the MOD. The file contains full details of
what settings can be changed and what values to use.

------------------------------------------------------------------------------
Level 2 - World/Map
When a map is loaded the worldspawn entity can have the following settings
which will override any quake.rc settings. These options below will affect
all clients (SP / Coop / DM ) and can even give / take items.

float gravity;                  // gravity of map (default = 800)
string fog;                     // console command (Den/R/G/B - '0.05 0.3 0.3 0.3')
float fog_density;              // Global fog density (works with trigger_fog)
vector fog_colour;              // Global fog colour (XYZ = RGB)
string fog_dpextra;             // extra DP fog parameters, default - '1 0 8192 1024 32'
string water_alpha;             // Water Alpha, default - 1.00
float particlemax;              // Amount of ACTIVE particles per map

float no_item_offset;           // All ammo/heal items use central point rotation
float no_item_rotate;           // No random rotated for all items (ammo/heal/misc)
float no_zaware;                // Switch OFF zaware monster attacks
float no_liquiddmg;             // Switch OFF liquid (slime/lava) monster damage
float knight_defskin;           // Default skin for new red shoulder knight model

float upgrade_axe;              // Upgrade Axe -1=disable, 1=enable
float upgrade_ssg;              // Upgrade Super Shotgun -1=disable, 1=enable
float upgrade_lg;               // Upgrade Lightning Gun -1=disable, 1=enable

float give_weapons;             // Bit flag for which weapons to give to the player
float take_weapons;             // 1=SG, 2=SSG, 4=NG, 8=SNG, 16=GL, 32=RL, 64=LG (excludes Axe)
float max_health;               // Update player health if below this value
float reset_health;             // Reset player health to this value (1-100)
float currentammo;              // =1 reset inventory, =0 minimum values
float ammo_shells, ammo_nails;  // Player ammo quantities for the map (reset/minimum)
float ammo_rockets, ammo_cells; // currentammo flag specifies how these values are used
float armortype;                // Armour type to start with 1=Green, 2=Yellow, 3=Red
float armorvalue;               // Quantity of armour to reset player (100/150/200)

------------------------------------------------------------------------------
Level 3 - Console Commands
Once a map is loaded certain impulse commands can be used to fine tune
settings or override current map defaults

ver         // Display version information for MOD
autoaim     // Toggle player weapon Auto Aim (default = OFF)
zaware      // Toggle Z Aware monsters (default = ON)
feet        // Toggle monster / player footstep sounds (default = ON)
liqdmg      // Toggle monster liquid damage (default = ON)
ritems      // Toggle randomly rotated items (default = ON)
upgproj     // Toggle Shotgun Projectiles/Casing (default = ON)
pixels      // Toggle texture pixel mode (linear = blurry, nearest = crispy)

==============================================================================
Mapping Documentation
---------------------

Entity keys for All entities
------------------------------------------------------------------------------
  spawnflags STARTOFF = 64;     // Starts off and waits for trigger
                                // Exceptions; lights, breakables
  string targetname;            // toggle state (use trigger ent for exact state)
  float noradiusdmg;            // Block all T_RadiusDamage, stops splashdamage
                                // can enable triggers to be direct damage only

New / Updated MISC entities
------------------------------------------------------------------------------
misc_fireball                   // Lava Balls, can toggle on/off with multiple triggers
  float dmg;                    // impact damage (default 5)
  float delay;                  // base time between spawning fireballs (default 3)
  float wait;                   // random time default 5 (= time + self.delay + (random() * self.wait) ) 
misc_drip                       // Single, continuous drip. Can be toggled on/off
  spawnflags SILENT = 2;        // Don't make any drip sound (good for multiple drips)
  float wait = 1;               // time between drips
misc_explobox                   // 32 x 64 unit exploding box with multiple styles
  spawnflag FLOATING = 32;      // Spawns floating, trigger entity to drop it
  string target;                // trigger events when box explodes
  float skin_override;          // 0=original, 1=rubicon2, 3=plasma, 4=toxic
  string noise;                 // Explosion sound (def=weapons/r_exp3.wav)
  float health;                 // Amount of damage required before exploding
  float dmg;                    // Override radius damage (def=160)
misc_explobox2                  // 32 square exploding box with multiple styles
  spawnflag FLOATING = 32;      // Spawns floating, trigger entity to drop it
  string target;                // trigger events when box explodes
  float skin_override;          // 0=original, 1=rubicon2, 3=plasma, 4=toxic
  string noise;                 // Explosion sound (def=weapons/r_exp3.wav)
  float health;                 // Amount of damage required before exploding
  float dmg;                    // Override radius damage (def=160)
misc_bob                        // model that gently moves back and forth
  string mdl;                   // Name of model (progs/candle.mdl)
  float angle;                  // direction movement, use "360" for angle 0
  float height;                 // direction intensity (def=4)
  float count;                  // direction cycle timer (def=2s, minimum=1s)
  float waitmin;                // Speed up scale (def=1) 1+=non linear
  float waitmin2;               // Slow down scale (def=0.75)
  float delay;                  // Starting time delay (def=0, -1=random)
misc_model / gtk_model          // Display Static Mesh Models
  spawnflags MISC_COLLISION = 2;// Bounding box collision enabled (square and no rotation)
  string mdl;                   // Specify model to load, full path "progs/candle.mdl"
  vector angles;                // 'pitch roll yaw' up/down, angle, tilt left/right 
  float ideal_yaw;              // Setup model with random Y axis rotation
  vector pos1;                  // used for selection of frame(s) has several setups
                                   X=0, Y=0, Z=exact frame number
                                   X->Y, Z=0 : will randomly pick a frame from the X,Y range
                                   X->Y, Z=-1 : will animate between the X,Y range, forward or backward setup
  vector pos2;                  // used for the selection of skin(s) has several setups
                                   X=0, Y=0, Z=exact skin number
                                   X->Y, Z=0 : will randomly pick a skin from the X,Y range
misc_shake                      // Shakes players inside of entity radius
  spawnflags VIEWONLY = 1;      // Shakes the view, not the player movement
  float count;                  // Radius of shake (def = 200)
  float wait;                   // Duration of shake (def = 2s)
  float dmg;                    // strength at center (def = 200)
  float sounds;                 // 1=long rubble (There is no default)
  string noise1;                // Starting sound (def = empty sound)
  string noise2;                // Finishing sound (def = empty sound)
misc_spark                      // Produces a burst of sparks at random intervals
  spawnflags BLUE = 2;          // sparks are blue in colour (def=yellow)
  spawnflags PALE = 4;          // sparks are pale yellow in colour (def=yellow)
  string target;                // Used to switch a light on/off in sync
                                // The light must start switched off (lights spawnflag=1)
  float wait;                   // time delay between bursts (wait + random() x wait). Def=2
  float cnt;                    // number of sparks in burst (0.5 + random() x 0.5) Def=16
  float angle;                  // direction for sparks to follow, use "360" for angle 0.
  float speed;                  // velocity speed of sparks (def=40)
  float height;                 // random velocity modifier (def=+/-20)
  float sounds;                 // 1=sparks, 4=silent, 5=custom
  string noise;                 // custom sound for sparks
misc_targetdummy                // Target practice dummy
  spawnflags KNIGHT = 1;        // Small Knight (small bounding box)
  spawnflags WIZARD = 2;        // Flying Wizard (tall bounding box)
  spawnflags OGRE = 4;          // Large ID ogre (wide bounding box)
  spawnflags HELL_KNIGHT = 8;   // Metallic Hell Knight (tall bounding box)
  spawnflags ZOMBIE = 16;       // Slow Zombie (small bounding box)
  spawnflags DEMON = 32;        // Jumpinh Demon (wide bounding box)
  spawnflags SHALRATH = 64;     // Spider like Shalrath (wide bounding box)
  spawnflags SHAMBLER = 128;    // Furry Shambler (Massive bounding box)
  string noise1;                // Targetnumber tracking weapon used
  string noise2;                // Targetnumber tracking enemy distance
  string noise3;                // Targetnumber tracking damage
  string noise4;                // Targetnumber tracking % efficency
  float wait;                   // Impact marker removal time (def=2)
misc_targetnumber               // Target number to display ingame
  float pos1;                   // X=top, Y=bottom digit quantity
misc_textbook                   // Custom text books for the player to read
  spawnflags NOMODEL = 1;       // Will not use book model + particles
  spawnflags PLINTH1 = 2;       // Setup book on top of plinth1 model
  spawnflags PLINTH2 = 4;       // Setup book on top of plinth2 model
  spawnflags COLLISION = 16;    // Use bounding box collision for plinth
  spawnflags ANGLEONLY = 32;    // Will only work when standing infront of entity (angle key)
  spawnflags NOEFFECTS = 128;   // No particle or effects active
  string target;                // trigger event when book is opened (only works once)
  float angle;                  // facing angle for model or direction player must be standing
  vector v_angle;               // The viewing angle the book is active (def=30,60,0)
  float exactskin;              // skin number for book (1-8, Brown1/2,Green1/2,Blue1/2,Red1/2)
  vector pos1;                  // Touch trigger minimin size (def=-48 -48 -32)
  vector pos2;                  // Touch trigger maximum size (def=48 48 32)
  string message;               // header message
  string message2;              // Body Text (need to add linefeeds)
  
New / Updated FUNC entities
------------------------------------------------------------------------------
func_button                     // button bmodel with touch/shoot functions
  float sounds;                 // 0=steam metal, 1=wooden, 2=metallic, 3=in-out, 4=Silent, 5=Custom
  string noise;                 // custom sound - open/close
func_door                       // Classic func door
  float yaw_speed;              // Alternative closing speed (def speed)
  float sounds;                 // 0=Silent, 1=Stone, 2=Base, 3=Chain, 4=Metal 5=Custom sounds
  float locksounds;             // 0=talktalk, 1=fast rattle, 2=slow rattle, 3=long rattle
  string noise;                 // custom sound - door locked sound (targetname+message)
  string noise1;                // custom sound - Moving/Open door (looping)
  string noise2;                // custom sound - Stop/Close door 
  string noise3;                // custom sound - Silver/Gold key try lock
  string noise4;                // custom sound - Silver/Gold key OPEN 
  float customkey;              // custom key required to open door (1-4 supported values)
  string message2;              // custom key message (You need the custom key) 
func_door_secret                // Two stage movement func_door clone
  float speed;                  // Override speed (def 50)
  float yaw_speed;              // Second movement speed (default = speed)
  float wait;                   // Override pausing before closing (def 5s)
  float sounds;                 // 1=Medieval, 2=Air base, 3=Ind base (def), 4=Silent, 5=Custom
  float locksounds;             // 0=talktalk, 1=fast rattle, 2=slow rattle, 3=long rattle
  string noise;                 // custom sound - door locked sound (targetname+message)
  string noise1;                // custom sound - Open
  string noise2;                // custom sound - Opening (looping)
  string noise3;                // custom sound - Closing
func_bob                        // bmodel that gently moves back and forth
  float angle;                  // direction movement, use "360" for angle 0
  float height;                 // direction intensity (def=4)
  float count;                  // direction cycle timer (def=2s, minimum=1s)
  float waitmin;                // Speed up scale (def=1) 1+=non linear
  float waitmin2;               // Slow down scale (def=0.75)
  float delay;                  // Starting time delay (def=0, -1=random)
func_bossgate                   // A NON SOLID bmodel when player has ALL runes
func_episodegate                // SOLID bmodel when player has SELECTED rune(s)
func_illusionary                // A NON SOLID bmodel with texture toggle
  spawnflags AFRAME;            // Start with the A frame animated texture
func_laser                      // A togglable laser, hurts to touch and can block
  spawnflags SOLID = 2;         // will block everything (players/monsters/projectiles)
  spawnflags NODMG = 4;         // touch function does no damage
  string message;               // message to display when activated
  string message2;              // message to display when deactivated
  float waitmin = -1;           // Will display the messages only once
  float sounds;                 // 1=standard laser (def), 4=silent, 5=custom
  string noise1;                // Trigger on sound (everytime turned on)
  string noise2;                // Trigger off sound (everytime turned off)
  float dmg;                    // damage to do on touch. default 1
  float alpha;                  // alpha value will vary +/- 20% (def=0.5)
func_plat                       // platform that starts low and travels upwards
  spawnflags MIN_TRIGGER = 4;   // Uses the min bounding box (instead of max) to calculate trigger
  spawnflags START_LOWER = 8;   // Will start the platform lower regardless of targetname
  spawnflags START_OPEN = 16;   // Used for lighting issues, place at bottom position
  float sounds;                 // 1=Base, 2=Medieval (def), 4=Silent, 5=Custom sounds
  string noise;                 // custom sound - moving (looping)
  string noise1;                // custom sound - Stopped
func_skill                      // Bmodel that changes based on current skill level
  spawnflags STARTOPEN = 1;     // Start in pos2 and await trigger (like func_door)
  float style;                  // 0 = easy, 1 = normal, 2 = hard, 3 = nightmare
  string message2;              // Override message when bmodel is touched/damaged
  string target;                // Particle emitters to switch on/off
  string target2;               // target(s) to fire when touched/damaged
  float health = 1;             // Can be damaged instead of touched
  float angle;                  // movement direction for trigger event
  float speed;                  // movement speed (100 default)
  float lip;                    // lip remaining at end of move (8 default)
  string noise1;                // Custom sound - Stop moving (doors/drclos4.wav)
  string noise2;                // Custom sound - Start/Loop moving (doors/stndr1.wav)
  string noise3;                // Custom sound - Touching (plats/medplat2.wav)
func_wall                       // A SOLID bmodel with toggled animated texture
  spawnflags AFRAME = 2;        // Start with the A frame animated texture
  spawnflags MODCHECK = 16;     // Will remove this entity if THIS mod is active


New / Updated TRIGGER entities
------------------------------------------------------------------------------
trigger_count                   // A counter which triggers target(s) when complete
  string message2;              // message to display when complete (ignores NOMESSAGE spawnflag)
  float delay;                  // time delay to fire final trigger event
  float sounds;                 // 0=silent,1=Secret,2=talk,3=switch,5=custom,6=secret2
  string noise;                 // custom sound to play when complete
trigger_drolejump               // Special jump trigger for enraged droles
  float wait = -1;              // Switch off trigger after being used once
  string target;                // Trigger additional targets (trigger once)
trigger_explode                 // Triggered once entity producing damage + sprite explosion
  float dmg;                    // explosive radius damage (def=40, -1=no damage)
  float delay;                  // time delay to explosion
trigger_fog                     // Change global fog to new value over time
  float speed;                  // time (secs) to fade from current to new (-1 = instant)
  float wait;                   // re-trigger time (-1 = trigger once)
  float fog_density;            // new fog density (def=0.5, -1=debug mode)
  float fog_colour;             // new fog colours (def=0.1 0.1 0.1)
trigger_heal                    // Healing pool/trigger function
  spawnflags BUBBLES = 2;       // Spawn bubbles within trigger volume when active
  string target;                // trigger once when players stands in trigger (start cycle)
  string target2;               // trigger once when healing expires (finish cycle)
  float wait;                   // Time between healing (default 1s)
  float healamount;             // Quantity to heal each time touched (default 10)
  float max_health;             // Total amount to heal (default 50, -1=no limit)
  float sounds;                 // 1=heal_15, 2=heal_25, 3=heal_100, 4=respawn, 5=custom (default 1)
  string noise;                 // custom sound override
  string message;               // centerprints to show when touching trigger
  float lip;                    // All messages are silent to the player (heal/expire) 1=block heal 2=block all
  string message;               // centerprints when players stands in trigger
  string message2;              // centerprints when healing function has expired
  float count;                  // total amount of active bubbles (default 5)
  float height;                 // Maximum travel distance for bubbles (default trigger size)
  float style;                  // 1-15 (grey, brown1, blue1=default, green1, red1, brown2, pinkyel, brown3, purp1, purp2, brown4, green2, yellow, blue2, red2)
trigger_hurt                    // Will hurt any touching entity
  spawnflags BUBBLES = 2;       // Spawn bubbles within trigger volume when active
  spawnflags MONSTER_ONLY = 4;  // Will only affect monsters
  spawnflags MODCHECK = 16;     // Will remove this entity if THIS mod is active
  float dmg;                    // damage from contact with trigger (def=5)
  float wait;                   // time between pain contact (def=1s)
  float angle;                  // Facing Direction for trigger to work, use "360" for angle 0
  float count;                  // total amount of active bubbles (default 5)
  float height;                 // Maximum travel distance for bubbles (default trigger size)
  float style;                  // 1-15 (grey, brown1, blue1=default, green1, red1, brown2, pinkyel, brown3, purp1, purp2, brown4, green2, yellow, blue2, red2)
trigger_itemrespawnupd          // Change the state of respawn flag on items
  spawnflags RESPAWN = 16;      // Value of respawn flag to copy to item
trigger_ladder                  // Brush based ladder (jump key to climb)
  float angle;                  // facing direction to use ladder (def = 360)
  float waitmin;                // time between climb sounds (def=material)
  float speed;                  // velocity speed to climb ladder (def=160)
  float sounds;                 // 1=metal, 2=wood, 3=rope, 4=silent, 5=custom (def=wood)
  string noise1-4;              // custom sounds to play when climbing
trigger_monsterjump             // Push monsters in a certain direction
  spawnflags FLYING = 2;        // Will affect flying monsters
  spawnflags SWIMING = 4;       // Will affect swiming monsters
  string target;                // targetting entity used for custom direction
  float wait = -1;              // Only trigger a monster jump once
  float angle;                  // direction of push (-2 is down, -1 up)
  float speed;                  // the speed thrown forward (def 200)
  float height;                 // the speed thrown upwards (def 200)
  string noise1;                // Only works with this type of monster (monster_ogre)
trigger_drolejump               // Will only work for ENRAGED Droles
trigger_monsterturret           // Temporarily turn a monster into a turret
  string target;                // When used, trigger additiona events, only trigger once
  float wait = -1;              // trigger only works once
  float count;                  // Random chance to pause; constant = -1, def = 0.25, range = 0 - 1
  string noise1;                // Only works with this type of monster (monster_ogre)
trigger_monstermovespeed        // Change the movement speed of monsters
  string target;                // Points to the monster(s) to change
  float state;                  // -1=No movement, 0=Toggle, 1=Free movement
  float wait = -1;              // trigger only works once
trigger_multiple                // Variabled sized bmodel used once
  spawnflags NOTOUCH = 1;       // can only be triggered via other entities
  spawnflags MODCHECK = 16;     // Will remove this entity if THIS mod is active
  spawnflags MONSTERS = 32;     // Can be touched/triggered by monsters
  float upgrade_axe = 1;        // Only trigger if player has got upgrade Axe
  float upgrade_ssg = 1;        // Only trigger if player has got upgrade Shotgun
  float upgrade_lg = 1;         // Only trigger if player has got upgrade Lightning Gun
  float health;                 // Can be damaged instead of touched
  float wait;                   // time between re-triggering
  float angle;                  // Facing Direction for trigger to work, use "360" for angle 0
  float sounds;                 // 1=Secret,2=talk(def),3=switch,4=silent,5=custom,6=secret2
  string noise;                 // Custom sound to play when triggered
  string message;               // Message to display when triggered
trigger_once                    // Variabled sized bmodel used multiple times
  spawnflags NOTOUCH = 1;       // can only be triggered via other entities
  spawnflags TRIG_INVIEW = 8;   // player has to see trigger (only works on _once)
  spawnflags MODCHECK = 16;     // Will remove this entity if THIS mod is active
  spawnflags MONSTERS = 32;     // Can be touched/triggered by monsters
  float upgrade_axe = 1;        // Only trigger if player has got upgrade Axe
  float upgrade_ssg = 1;        // Only trigger if player has got upgrade Shotgun
  float upgrade_lg = 1;         // Only trigger if player has got upgrade Lightning Gun
  float health;                 // Can be damaged instead of touched
  float angle;                  // Facing Direction for trigger to work, use "360" for angle 0
  float wait;                   // Always set to -1, its trigger_once!
  float sounds;                 // 1=Secret,2=talk(def),3=switch,4=silent,5=custom,6=secret2
  string noise;                 // Custom sound to play when triggered
  string message;               // Message to display when triggered
  float t_length;               // Activation radius for inview triggers
trigger_push                    // Pushes the player and Grenades!
  spawnflags PUSH_ONCE = 1;     // Removes itself after firing once
  spawnflags SILENT = 2;        // No wind sound for player
  spawnflags NOMONSTERS = 4;    // Monsters cannot be pushed by this trigger
  string target;                // targetting entity used for custom direction
  float angle;                  // direction of push (-2 is down, -1 up)
  float angles;                 // Pitch Yaw Roll (up/down, angle, tilt left/right)
  float speed;                  // Speed of push direction (def=1000)
trigger_relay                   // Triggers target(s) with custom sounds and messages
  spawnflags RANDOM = 2;        // Will randomly select between target/target2
  float cnt;                    // Random amount of time to add to delay
  float wait = -1;              // Will only fire targets once
  float waitmin = 0.0-1.0;      // % random chance between target/target2
  float sounds;                 // 1=Secret,2=talk(def),3=switch,4=silent,5=custom,6=secret2
  string noise;                 // custom sound to play when triggered
  string message;               // message to display when triggered
trigger_secret                  // Updates map secrets found counter
  spawnflags NOTOUCH = 1;       // can only be triggered via other entities
  spawnflags NOMSG = 2;         // Remove/Block any trigger secret message
  float health;                 // Can be damaged instead of touched
  float angle;                  // Facing Direction for trigger to work, use "360" for angle 0
  float sounds;                 // 1=Secret(def),2=talk,3=switch,4=silent,5=custom,6=secret2
  string noise;                 // custom sound to play when triggered
  string message;               // message to display when triggered
trigger_setskill                // Sets player skill level (via console)
  spawnflags NOTOUCH = 1;       // can only be triggered via other entities
  float health;                 // Can be damaged instead of touched
  float wait = -1;              // Switch off trigger after being touched once
  float angle;                  // Facing Direction for trigger to work, use "360" for angle 0
  string message;               // Skill Level - 0=easy, 1=normal, 2=hard, 3=nightmare
trigger_teleport                // Teleport player/monsters to target location
  spawnflags PLAYER_ONLY = 1;   // Can only be used by players (nothing else)
  spawnflags SILENT = 2;        // No teleporter hum sound regardless of state
  spawnflags STARTON = 4;       // Will start active regardless of targetname setting
  string target;                // Points to info_teleport_destination entity
  float wait = -1;              // Switch off trigger after being touched once
  float speed;                  // forward momentum speed after teleporting (def=300)
  float volume;                 // teleporter hum sound volume (def=0.5)
  string noise;                 // custom sound to play when active (must be looped, def=hum1.wav)
  float waitmin;                // length of the custom sound (def=3.622 for hum1.wav)
trigger_void                    // Garbage collector for bottom of skyboxes
  spawnflags NO_CLIENT = 1;     // Ignore cients (anything flagged as a client)
  spawnflags NO_MONSTER = 2;    // Ignore monsters (anything flagged as a monster)
  spawnflags NO_AMMO = 4;       // Ignore ammo types (all ammo projectile types)
  spawnflags NO_EGG = 8;        // Ignore minion eggs (affects shalrath, wraiths)
  spawnflags NO_TEMP = 16;      // Ignore temporary ents (gibs, sparks, smoke)
  spawnflags NO_ITEM = 32;      // Ignore items (weapons,armor,keys,runes,powerups)
 
 
 Switchable light entities (state can be toggled via triggers)
 + Need new compiler for the style key to be linked to the light model entity
------------------------------------------------------------------------------
spawnflags LIGHTOFF = 1;        // Starts off and waits for trigger
spawnflags NO_SOUND = 2;        // No ambient sound
spawnflags NO_STATIC = 4;       // Will not turn into static entity
spawnflags NO_EFFECTS = 128;    // Will not spawn any particle effects
light_candle                    // Variable size, width candle, place 16 units off ground
  spawnflags SHADOW = 8;        // Turn ON shadows in DP engine
  float angle = 0, 1-360;       // 0=random angle, 1-360=specific
  float height;                 // Height : 1=short, 2=medium, 3=regular, -1=random
  float t_width;                // Width : 1=regular, 2=fat, 3=thin, -1=random
  float lip;                    // Moves model down to ground plane (default = 16)
light                           // Non-displayed light
light_fluoro                    // Makes steady fluorescent humming sound
light_fluorospark               // Makes sparking, broken fluorescent sound
light_globe                     // Sphere globe light (sprite)
light_postlight                 // Light post from Quoth MOD (multiple frames)
light_tubelight                 // Tube light from Quoth MOD
light_fixture1                  // Wall light from Rubicon2 MOD
light_torch_small_walltorch     // Short wall torch
light_flame_small_yellow        // Small yellow flame
light_flame_large_yellow        // Large yellow flame


All items (health, armor, weapons, ammo, keys, sigils, artifacts)
------------------------------------------------------------------------------
spawnflags RESPAWN = 16;        // Can respawn after being picked up
spawnflag FLOATING = 32;        // Spawns floating, trigger entity to drop it
spawnflags STARTOFF = 64;       // Starts off and waits for trigger to spawn
spawnflags NOEFFECTS = 128;     // No particle or effects active on this entity
float upgrade_axe = 1;          // Only spawn if player has got upgrade Axe
float upgrade_ssg = 1;          // Only spawn if player has got upgrade Shotgun
float upgrade_lg = 1;           // Only spawn if player has got upgrade Lightning Gun
float respawn_effect = 1;       // Show particle effect while respawning
float respawn_time;             // Time to wait respawning (=-1 instant spawn)
float respawn_count;            // Total amount of times to respawn an item
float respawn_trig = 1;         // Wait for a trigger event before respawning


Ammo Packs
------------------------------------------------------------------------------
spawnflag A_LARGE = 1;          // Double ammo boxes quantity (different model)
spawnflag A_LID = 2;            // Shells and Spikes have lids (matching rotation)
float angle = 0 or -1;          // Random rotation everytime spawned
float angle = 1-359;            // Specific rotation (lid/frame always match)
float skin_override = 1-2;      // Override world type 1=Base Green, 2=Medieval Wood
float frame_box = 1-7;          // Special frames for rockets, plasma boxes and lids


New Weapons & Items
------------------------------------------------------------------------------
weapon_upgrade_axe              // Give the player the new Shadow Axe
weapon_upgrade_ssg              // Give the player the new Widowmaker Shotgun
weapon_upgrade_lg               // Give the player the new Plasma Gun
weapon_shotgun                  // Give the player the single barrel Shotgun
item_artifact_tomeofpower       // Tome of Power, custom event trigger
  string target;                // Trigger targets to fire when item touched
  string message;               // Centerprint message when item is picked up
  string noise;                 // Custom pickup sound (def=misc/medkey.wav)
item_artifact_nail_piercer      // All nail attacks will travel through monsters
item_artifact_sharp_shooter     // Reduces the bullet spread of all Shotguns
item_backpack                   // Backpack with random/exact amount of ammo
  spawnflags SHELLS;            // ammo for SG / SSG / RG
  spawnflags NAILS;             // ammo for NG / SNG
  spawnflags ROCKETS;           // ammo for GL / RL
  spawnflags CELLS;             // ammo for LG
  float count;                  // random amount of ammo to give (works with spawnflags)
  float ammo_shells;            // exact amount of shells
  float ammo_nails;             // exact amount of spikes
  float ammo_rockets;           // exact amount of rockets
  float ammo_cells;             // exact amount of cells
  float armorvalue;             // armor shards (gives green armor if none present)
  float armortype = 1;          // random amount of armor shards (uses count)
  float exactskin;              // 0=Original, 1=green, 2=blue, 3=red, 4=yellow, 5=swamp, 6=white, 7=pale
item_keyx                       // Custom key for opening func_door bmodels
  spawnflags CKEY1 = 1;         // Key type 1, each key can only be one type
  spawnflags CKEY1 = 2;         // Key type 2, this can be any model, not just keys
  spawnflags CKEY1 = 4;         // Key type 3
  spawnflags CKEY1 = 8;         // Key type 4
  string mdl;                   // model name to load/display (progs/model.mdl)
  float skin;                   // Skin number for custom model
  string netname;               // XXX Part of pickup string (You got the XXX)
item_custom                     // Custom Pickup Item
  string mdl;                   // model name to load/display (progs/model.mdl)
  float skin;                   // Skin number for custom model
  string netname;               // XXX Part of pickup string (You got the XXX)
  string noise;                 // Pickup sound (def=weapons/lock4.wav)
  string pos1;                  // Pickup bounding box minimum (def=-16 -16 -24)
  string pos2;                  // Pickup bounding box maximum (def=16 16 32)
  float bodyfadeaway;           // Model will fade away on pickup
  float part_active;            // = 1 Enable particle burst on pickup
  string part_ofs;              // Particle Origin Offset (def='0 0 0')
  float part_tcount;            // Particle Quantity (def=20)
  float part_life;              // Particle Life Time (def=2s)
  float part_style;             // 1=yellow, 2=green, 3=red, 4=blue, 5=purple, 6=fire, 7=white
  float part_movetype;          // 2=center, 3=up, 4=shockwave, 5=skull, 6=lost, 7=minotaur


New Ambient Sound entities
------------------------------------------------------------------------------
ambient_custom_sound            // Play a sound on a periodic basis
  spawnflags PLAYONCE = 2;      // When triggered plays once
  float volume;                 // volume of sound (default 1, capped at 1)
  string noise;                 // path to the sound to play (ambience/windgust1.wav)
  float wait;                   // random time between sounds (default 20; =-1 no random element)
  float delay;                  // minimum time between sounds (default 2)
  float waitmin;                // Starting time (waitmin + random() x waitmin; =-1 no delay)
  float impulse;                // channel on which to play sound (0-7) (0 automatic is default)
  float speed;                  // attenuation -1=no attenuation, 1=normal (default), 2=idle, 3=static, 4=quiet
ambient_custom_loop             // Custom ambient (must be looped) sound
  float volume;                 // volume of sound (default 1, capped at 1)
  string noise;                 // custom sound to play (looped)


Ritual / Hipnotic Rotation entities (as is, no changes)
------------------------------------------------------------------------------
info_rotate                     // center point for rotatable objects
func_rotate_entity              // Basic rotating object
  spawnflags TOGGLE = 1;        // allows the rotation to be toggled on/off
  spawnflags STARTON = 2;       // wether the entity is spinning when spawned
  string target;                // points to center of rotation entity
  float rotate;                 // The rate of rotation in degrees
  float speed;                  // time taken to go from zero to full speed and vice-versa.
path_rotate                     // Corner Path for rotate_train
  spawnflags ROTATION = 1;      // Rotate train at rate specified by 'rotate'
  spawnflags ANGLES = 2;        // Rotate to the angles specified by 'angles'
  spawnflags STOP = 4;          // stop train and wait to be retriggered
  spawnflags NO_ROTATE = 8;     // stop train rotating when waiting to be triggered
  spawnflag DAMAGE = 16;        // Cause damage based on 'dmg'
  spawnflags MOVETIME = 32;     // Interpret 'speed' as the length of time to take moving
  spawnflags SET_DAMAGE = 64;   // Set all targets damage to 'dmg'
  string event;                 // trigger when train arrives at path_rotate      
  string noise;                 // sound to play when train stops
  string noise1;                // sound to play when train moves
  float speed;                  // new speed of the train after it reaches corner
func_rotate_train               // moving platforms that players can ride
  string path;                  // Starts at'path_rotate' position
  float speed;                  // travel speed (def=100)
  float dmg;                    // blocking damage (def=0)
  float sounds;                 // 1 = ratchet metal
  string noise;                 // sound to play when train stops
  string noise1;                // sound to play when train moves
func_movewall                   // Emulate collision on rotating objects
  spawnflags VISIBLE = 1;       // Causes brush to be displayed
  spawnflags TOUCH = 2;         // Cause damage when touched by player
  spawnflags NONBLOCKING = 4;   // makes the brush non-solid,  This is useless if VISIBLE is set
  float dmg;                    // damage to cause when touched or blocked
rotate_object                   // Defines a bmodel object to be rotated
func_rotate_door                // Rotating door moving around a point of rotation
  spawnflags STAYOPEN = 1;      // Reopen after closing, stops a once only door from closing if blocked
  float dmg;                    // Damage caused when blocked (def=2)
  float speed;                  // Time taken to rotate open/close
  float sounds;                 // 1=medieval 2=metal 3=base (def=1)


==============================================================================
Entity State System
-------------------

When Quake first came out there were strict limitations on how many entities
could exist and be active at the same time. The quick fix solution to this
problem was to use the killtarget key so that entities could be removed. 
This was a very powerful feature with very few restrictions on what it 
could affect or destroy at the same time.

The idea of the entity state system is to create a way to safely switch
entities on, off or have then temporarily disabled. This will help prevent
situations where entity chains are broken or strange errors occur because
the touch function does not have an entity anymore.

There are two ways to change the state of any entity as follows:

Method 1
--------
Add an extra key on triggering entities (_once, _multi, _relay etc) 

------------------------------------------------------------------------------
float estate_trigger;           // new entity key command
  = 1;                          // Switch ON  -Added to world
  = 2;                          // Switch OFF -Removed from world
  = 4;                          // Disabled   -blocks entity functionality
  = 8;                          // Reset      -reset back to spawn state

The ON state (default) will allow the entity to work as designed, be
toggled and physically exist as per its setup.

The OFF state will block all of the designed functionality and hide 
the entity from interaction with the world/player.

The DISABLE state blocks any toggle ability or entity functionality
and turns off any visual aids like animated textures.

The RESET state will revert the entity back to the state it was in when
starting the map. There are exceptions, it does not work on every entity.
  
Method 2
--------
Use one of the new triggering entities listed below:
  
------------------------------------------------------------------------------
trigger_entitystate_on          // Switch the target(s) ON
trigger_entitystate_off         // Switch the target(s) OFF
trigger_entitystate_disable     // DISABLE the target(s)
trigger_entitystate_reset       // RESET the target(s)

These new entities will affect multiple targets and are designed to show
(visually) what is happening in the editor by using target lines. They
work/setup very much like a trigger_relay in the editor.


==============================================================================
Starting Point, do you remember me!?!
-------------------------------------

Quake starts in a hub style map with various skill selection portals
and several episodes gates which the player can complete in any order.
Once all of the episodes are completed a final area is unlocked and the
player can beat the final boss and complete the game.

When the player starts the game they begin at the 'info_player_start'
spawn location and once the player has some rune(s) they return to the 
start map using the 'info_player_start2' entity instead.

The start2 system always returns the 'trigger_changelevel' portals to the
same location in the start map. To allow the creation of more detailed
start map layouts there can now be up to seven 'info_player_start2'
locations in the start map which are all linked to different returning
changelevel triggers.

By adding the new key 'startspawn2' to a 'trigger_changelevel' entity
with a unique number (1-7) and then adding the same key and number to an
'info_player_start2' entity in the returning map, the player will start
at the new location instead of the default one.

When the new key 'startspawn2' is used there is no rune check done
anymore and the player will spawn in the next or returning map at a
'info_player_start2' location, the default number is one.

With the ability to create hub maps with multiple returning points there
is now a new 'trigger_rune' entity which can be used to test the players
inventory for runes and trigger different events. This is a touch
trigger unlike the func_episode/boss triggers which only happen at the
beginning when the map is loaded.

All player spawn entities will fire any 'target' triggers when used as a
starting location, this can help fine tune locations ready for the player.

When the end intermission screen is active showing map totals for monsters
killed and secrets found, the intermission camera can cycled around multiple
'info_intermission' locations. When the player looks through these extra
cameras any target keys found are triggered.

------------------------------------------------------------------------------
info_player_start               // Starting point for players without runes
  string target;                // triggered target(s) when used as a client destination
info_player_start2              // Starting point for players with runes or startspawn2 system
  string target;                // triggered target(s) when used as a client destination
  float startspawn2;            // Unique spawn location number matching a trigger_changelevel

info_player_coop2               // Starting position for coop games
  string target;                // triggered target(s) when used as a client destination
  float startspawn2;            // Unique spawn location number matching a trigger_changelevel
info_player_deathmatch          // Starting position for deathmatch games
  string target;                // triggered target(s) when used as a client destination
info_stuffcmd                   // Puts specified message into the console
  string message;               // Command eg "r_wateralpha 0.3"
info_teleport_destination       // Destination for trigger_teleport bmodels
  string targetname;            // triggered target(s) when used as a client destination
  string target;                // fires when the entities is used as a destination
info_intermission               // camera point for the intermission
  string target;                // triggered target(s) when used as a viewing camera

trigger_changelevel             // End of level trigger to change/reload map
  spawnflags NO_INTERMIS = 1;   // No Intermission screen, load next map without pause
  spawnflags RESETINV = 2;      // Reset player inventory to default (Shotgun+Shells)
  string target;                // name of target(s) to trigger before intermission
  string map;                   // The name of next map (e.g. e1m1) "" == same map
  float startspawn2;            // Special unique number (1-7) which must match info_player_start2
trigger_rune                    // Triggers when the player has certain runes
  spawnflags E1 = 1;            // Player has Rune 1
  spawnflags E2 = 2;            // Player has Rune 2
  spawnflags E3 = 4;            // Player has Rune 3
  spawnflags E4 = 8;            // Player has Rune 4
  float health;                 // Can be damaged instead of touched
  float angle;                  // Facing Direction for trigger to work
  string target;                // trigger to fire if player has SOME runes
  string noise1;                // trigger to fire if player has Rune 1
  string noise2;                // trigger to fire if player has Rune 2
  string noise3;                // trigger to fire if player has Rune 3
  string noise4;                // trigger to fire if player has Rune 4


==============================================================================
Trains, Chains and Corners
--------------------------

There are many good examples of trains in the original ID maps with some
notable ones being the opening sequence of the Demon door in E1M2 and the
long wandering platforms in E3M4. These are classics because they show the
player that the environment can be more than just doors or buttons and with
a clever use of path corners, things can flow in multiple directions.

The original func_train entity has limited options (start on/off), it was
designed to follow a chain of path corners in loops or pause and stop at
various corners via different wait states.

This MOD has changed the func_train entity so that it can switch paths, 
speed up or slow down, pause at corners, go backwards or forward and
even be invisible! All these extra options are split across both train 
and corner entities with some being used by monsters.

A func_train entity starts as a collection of brushes in the editor which
eventually become a bmodel located at position 0,0,0 and its origin is an
offset of what movement has happened since spawning. Bmodels have collision
on the edges of their bounding boxes and are often used as crushers because
they have no roll back condition.

The new func_trains can be setup with no collision or even have the bmodel
replaced with a model instead! Once the spawnflag MODEL is enabled the train
will default to an empty model (invisible) unless the 'mdl' key is defined. 
This can be useful for the new trap shooters entities because they can now
track moving targets like trains.

The original train entity had restrictions (start on/off) based on the
setting of the 'targetname' key and this has been removed with a new 
spawnflag. The final addition is a new spawnflag to make trains start 
backwards through their entity chains instead of forward.

------------------------------------------------------------------------------
func_train                      // Moving bmodels, always start on 2nd frame
  spawnflags STARTON = 1;       // Start moving straight away if targetname is used
  spawnflags NONSOLID = 2;      // No coliision or blocking functionality (uses bmodel)
  spawnflags MODEL = 4;         // Model with no collision (use mdl key, def=empty model)
  spawnflags TOUCH = 8;         // Nonsolid or model trains have touch damage (dmg)
  spawnflags REVERSE = 32;      // Start going backward through path_corner chain
  string target;                // Name of first path_corner to start at (instant move)
  string mdl;                   // Specify a model for MODEL mode only (progs/object.mdl)
  float speed;                  // moving speed (def=100)
  float dmg;                    // block damage (def=2)
  float sounds;                 // 0=Silent, 1=Train, 5=Custom sounds
  string noise;                 // custom sound - stopped
  string noise1;                // custom sound - moving (looping)

The real power behind the new func_train entity comes from the new options
available on the path corners and dynamically via triggering entities.
Essentially trains have options for appearance and movement, while the path
corners have options for routes, speed and direction.

Path corners are usually setup with a 'targetname' and 'target' key which are
linked together with other corners into a large single loop. To create route
variety an alternative route key 'target2' has been added and depending on
which route logic mode is active can be picked randomly or exactly.

As a general rule if a path corner DOES NOT have a second alternative 
'target2' key route defined then there is NO ROUTING LOGIC active. The path
corner is just forward or backward routes dictated by direction flow.

The default route logic mode is RANDOM and when a second route is defined
the train or monster will randomly pick between 'target' and 'target2' keys.
When the train is moving backwards the RANDOM logic mode excludes the current
path direction first and then randomly picks from the remaining two. 

The second route logic mode is EXACT and initially setup via a spawnflag
option. When a train or monster arrives at an EXACT route path corner
they are sent (no choice) in the currently selected route. This mode will
even send a train back the way it came if selected and always change the
direction flow to suit the route taken.

All links backward are automatically generated when the path corners are
spawned. If this process has picking the wrong target (check dev arrows) then
the backward link can be overridden with the 'targetback' key.

The downside to path corner networks is that they do not change, they
are static and cannot be affected by the players actions. Several new keys
have been added that when setup on firing triggers that target path corners
will change internal settings.

The key 'corner_route' will change the path corner to either RANDOM or EXACT
routing logic or a specific route number, as long as the route exists.

The route number on a path corner can either be changed with the new 
'corner_route' key or when the EXACT mode is active and a trigger is fired
at the corner, it will cycle around between the routes. 

The key 'corner_switch' will change the direction of a path corner to
forward or backward routing or toggle the current value. This will affect
any train using this corner and reverse its direction.

The key 'corner_pause' will change the NOPAUSE spawnflag and 'wait' key
to instruct any train to either stop or continue on. The new key supports 
exact values (on/off) or toggles the current state.

The key 'corner_event' is only active on the path corner and acts like
a typical 'target' key on any entity which will trigger target(s) when
any func_train entity is at the path corner.

The 'state' key only works when EXACT logic routing is active and will
setup an initial value for which route is selected.

------------------------------------------------------------------------------
path_corner                     // Node based path routing system
  spawnflags EXACT = 1;         // Exact route logic (def=random route choices)
  spawnflags INSTANT = 2;       // Move instantly to this corner if next destination
  spawnflags REVERSE = 4;       // Train direction is reversed for next corner
  spawnflags NOPAUSE = 8;       // Train does not pause on this path corner
  string corner_event;          // Name of target(s) to trigger when used/touched
  float corner_route;           // Change path_corner route (1-3 routes, 4=exact, 5=random)
  float corner_switch;          // Change spawnflags REVERSE (-1=NO, 1=YES, 2=Toggle)
  float corner_pause;           // Change spawnflags NOPAUSE (-1=NO, 1=YES, 2=Toggle)
  float state;                  // Starting route (1=forward, 2=alt forward, 3=backward)
  string target;                // Targetname of FORWARD route
  string target2;               // Alternative FORWARD route
  string targetback;            // Override default BACKWARD route
  float wait;                   // fixed amount of time to pause at corner (=-1 stop)
  float delay;                  // random amount of time to pause at corner
  float alpha;                  // Override default for visual arrows (def=0.35)
  float speed;                  // Override default speed of func_train (def=100)

With all the new options, extra routes and dynamically changing parameters it
is difficult to see what is going on with a path corner network. To help with
this problem when path corners are spawned and developer mode is active, a set
of coloured arrows will be drawn showing status, routes and any errors.

All forward and backward routes will be displayed in yellow, any secondary 
routes 'target2' will be shown in green and currently selected exact logic
routes are displayed in white. All errors are shown in red.

A path corner with a missing 'target' key or a broken back link will be shown
with a red arrow pointing upwards. These path corners are labelled as DEADENDS
and anything arriving at them will be turned around automatically.

The helper arrows on path corners is only displayed when developer mode is
active and can be switched on/off with an impulse command. Check the quake.rc
file for full details of mod commands.

  
==============================================================================
Traps, Tricks and Tips
----------------------

It is hard to image Quake without some kind of trap, whether it be a spike
shooter hidden on the ceiling or a large pit of lava waiting for one wrong step!
There should be something lurking around a corner, high above the player or
just below waiting to kill the unobservant player.

Here is a list of all trap related entities added/updated to the MOD
------------------------------------------------------------------------------
trap_grenadeshooter             // fires a GRENADE in the direction determined by angle
  spawnflags LARGE = 1;         // shoots high damage grenade (Player damage, def=ogre)
  spawnflags TOGGLE = 32;       // Trigger will toggle the shooter on/off instead
  spawnflags TRACK = 128;       // Will update target entity origin before firing
  string targetname;            // toggle state (use trigger ent for exact state)
  string target;                // targetting entity used for custom direction
  float angle;                  // direction for projectile to follow
  float wait;                   // time between projectiles (def=1s)
  float delay;                  // random time between projectile (def=0s)
  float speed;                  // speed (def/sng=500, laser=600, wiz=500, hell=300)
trap_lightningshooter           // fires a LIGHTNING in the direction determined by angle
  spawnflags LARGE = 1;         // Cthton Boss Lightning (double damage)
  spawnflags TOGGLE = 32;       // Trigger will toggle the shooter on/off instead
  spawnflags TRACK = 128;       // Will update target entity origin before firing
  string targetname;            // toggle state (use trigger ent for exact state)
  string target;                // targetting entity used for custom direction
  float angle;                  // direction for projectile to follow
  float wait;                   // time between projectiles (def=1s)
  float delay;                  // random time between projectile (def=0s)
  float distance;               // Maximum distance to travel (def=600)
  float dmg;                    // Damage from lightning strike (def=15, large=30)
trap_rocketshooter              // fires a ROCKET in the direction determined by angle
  spawnflags LAVABALL = 1;      // shoots Chthon lava ball (Player damage)
  spawnflags FIREBALL = 2;      // shoots Gargoyle fire ball (low damage)
  spawnflags TOGGLE = 32;       // Trigger will toggle the shooter on/off instead
  spawnflags TRACK = 128;       // Will update target entity origin before firing
  string targetname;            // toggle state (use trigger ent for exact state)
  string target;                // targetting entity used for custom direction
  float angle;                  // direction for projectile to follow
  float wait;                   // time between projectiles (def=1s)
  float delay;                  // random time between projectile (def=0s)
  float speed;                  // speed (def/sng=500, laser=600, wiz=500, hell=300)
trap_spikeshooter               // fires a SPIKE in the direction determined by angle
  spawnflags SNG = 1;           // shoots large spike (SNG damage)
  spawnflags LASER = 2;         // shoots laser (Enforcer damage)
  spawnflags WIZARD = 4;        // shoots acid spike (Wizard damage)
  spawnflags HELLK = 8;         // shoots fire spike (Hell Knight damage)
  spawnflags TOGGLE = 32;       // Trigger will toggle the shooter on/off instead
  spawnflags TRACK = 128;       // Will update target entity origin before firing
  string target;                // targetting entity used for custom direction
  float angle;                  // direction for projectile to follow
  float wait;                   // time between projectiles (def=1s)
  float delay;                  // random time between projectile (def=0s)
  float speed;                  // speed (def/sng=500, laser=600, wiz=500, hell=300)
trap_gasshooter                 // Fires a stream of dangerous particles
  spawnflags STEAM = 1;         // White hot clouds of steam (default)
  spawnflags FIRE = 2;          // Will add burning debuff to player
  spawnflags POISON = 4;        // Will add poison debuff to player
  spawnflags SILENT = 16;       // Stream is silent, no loop/off sounds
  spawnflags TOGGLE = 32;       // Trigger will toggle the shooter on/off instead
  spawnflags TRACK = 128;       // Will update target entity origin before firing
  string target;                // targetting entity used for custom direction
  float angle;                  // direction of streaming particles
  float wait;                   // time between particles (def=0.05s)
  float waitmin;                // auto switch off timer (def=0.5s)
  float speed;                  // velocity speed (def=200)
  float dmg;                    // damage from contact with particles (def=1)
trap_pendlong                   // Long (192 units) Pendulum
  spawnflags REVERSE = 1;       // Starts at frame 12 instead 0
  spawnflags ONESWING = 2;      // Will do a single swing (back + forth)
  float dmg;                    // Damage to do for each contact, def=5
  float waitmin;                // Damage throttle to touch function, def=0.5s
  float wait;                   // amount of time (seconds) before starting swinging
trap_pendlongx                  // Long (192 units) Pendulum working on X axis only
  spawnflags REVERSE = 1;       // Starts at frame 12 instead 0
  spawnflags ONESWING = 2;      // Will do a single swing (back + forth)
  float dmg;                    // Damage to do for each contact, def=5
  float waitmin;                // Damage throttle to touch function, def=0.5s
  float wait;                   // amount of time (seconds) before starting swinging
trap_pendshort                  // Short (128 units) Pendulum
  spawnflags REVERSE = 1;       // Starts at frame 12 instead 0
  spawnflags ONESWING = 2;      // Will do a single swing (back + forth)
  float dmg;                    // Damage to do for each contact, def=5
  float waitmin;                // Damage throttle to touch function, def=0.5s
  float wait;                   // amount of time (seconds) before starting swinging
trap_pendlongx                  // Short (128 units) Pendulum working on X axis only
  spawnflags REVERSE = 1;       // Starts at frame 12 instead 0
  spawnflags ONESWING = 2;      // Will do a single swing (back + forth)
  float dmg;                    // Damage to do for each contact, def=5
  float waitmin;                // Damage throttle to touch function, def=0.5s
  float wait;                   // amount of time (seconds) before starting swinging
trap_sawbladex                  // Rotating Saw Blade X Axis only
  string target;                // Name of first path_corner to start at (instant move)
  float speed;                  // Speed to follow path, def=10
  float yaw_speed;              // Rotation speed for Saw Blade (def=180)
  float dmg;                    // Damage to do for each contact, def=4
  float waitmin;                // Damage throttle for ON touch function, def=0.1s
  float height;                 // Damage throttle for OFF touch function, def=1s
  float lip;                    // Deceleration time; def=2s, =-1 instant stop
  float sounds;                 // 0=Silent, 1=Woodmill, 5=Custom sounds
  string noise;                 // Custom sound - stopping, should be short
  string noise1;                // Custom sound - moving (looping)
trap_sawbladey                  // Rotating Saw Blade Y Axis only
  string target;                // Name of first path_corner to start at (instant move)
  float speed;                  // Speed to follow path, def=10
  float yaw_speed;              // Rotation speed for Saw Blade (def=180)
  float dmg;                    // Damage to do for each contact, def=4
  float waitmin;                // Damage throttle for ON touch function, def=0.1s
  float height;                 // Damage throttle for OFF touch function, def=1s
  float lip;                    // Deceleration time; def=2s, =-1 instant stop
  float sounds;                 // 0=Silent, 1=Woodmill, 5=Custom sounds
  string noise;                 // Custom sound - stopping, should be short
  string noise1;                // Custom sound - moving (looping)


==============================================================================
Breakable System
----------------

The breakables system is a way to create interactive environments by opening up
alternative routes, having sudden destructible monster ambushes and encouraging
plenty of rewarding player exploration moments.

func_breakable - is the primary entity of the breakable system
func_breakable_spawner - is a point entity clone of func_breakable
func_breakable_wall - used to fill in the gaps or reveal the details
trigger_monsterbreak - will trigger a breakable and monster together

The breakable system starts with the style key which defines all the defaults
based on material types. Each style has default rubble bmodels, unique 
break/impact sounds, particle effects and different rubble velocity values.

If a different style of breakable is required there are plenty of extra types which
can be specified by the brkobjects key (10-12=rocks, 20-22=woods, 30-32=glass, 
40-42=metals, 50-54=brick) and more will be added over time.

To create your own custom rubble the new bmodels should be setup in sets of 4 
(roughly 8/16/24/32 units in size) and specified with the brkobj1-4 keys.
There are plenty of example map files under the 'maps/brk' directory which
can be re-painted to suit your needs. Always create any custom bmodels in
the map directory so that they can be grouped together with the map files.

It is recommended that all new bmodels be compiled with minimum lighting
using the following command line (tycompiler\light -light 150 %1) The light
value (150) should be changed to suit the location of the breakable.

The breakable system will randomly pick a rubble bmodel from the defined set
and if something is required to be picked more frequently then duplicate the
required bmodel across several of the brkobj keys.

When a breakable is triggered or the health reaches zero the initial bmodel is
removed and any targets are fired. This is to make sure that any broken detail
is present before any rubble is generated. The system will then try 
(up to 4 times) to spawn rubble inside of the original bmodel volume.

When a monster is pursuing the player and finds a breakable in the way they
will try to destroy it using either melee or range attacks. If the breakble
is for scripted events only then add the extra spawnflags noshoot and nomonster
to prevent any unscripted interactions.

When a breakable is damaged and not destroyed the system shows feedback to the 
player with specially coloured particles instead of the default white ones
used for world geometry. All of the default material styles have particle
colours setup and this can be fine tuned with the entity key pos1.

Breakables inside of liquids (underwater) will break apart at the same velocity
as anywhere else in the map and can be fine tuned either by changing the 
velocity keys (brkvelbase, brkveladd) or by changing the gravity (brkgravity)
of rubble so that it falls slower.

The default velocity for the rubble is a directional force and this is based on
the angle of impact or the triggering entity. The angle of velocity can be
changed by moving around the trigger so that the rubble can fall in more visually
impressive ways. The system also supports the angle key on the original bmodel and
this will override any directional force. The angle key set to 1-360 will produce
a flat (XY) velocity, an up direction is like a fountain from the center and a 
downward angle is without any XY movement. Depending on where the player is in 
relation to the breakble when it falls apart, a special angle key setup might 
produce better visual results.

There are plenty of monsters that have jumping abilities and their collision
detection does not always produce perfect results. It is possible to setup
breakables with an extra touch function that will detect jumping monsters and
break apart if a flying monster hits them and the (brktrigjump) key active.

Breakable entity details
------------------------------------------------------------------------------
func_breakable                  // Spawn breakable ojects from a volume
  spawnflag START_OFF = 1;      // Will wait for trigger to spawn
  spawnflag NOSHOOT = 2;        // Cannot be damaged or shot, trigger only
  spawnflag EXPLOSION = 4;      // trigger sprite/particle explosion
  spawnflag SILENT = 8;         // No initial breakage sound
  spawnflag DAMAGE = 16;        // Spawning rubble can damage (def = 2, use dmg key for touch damage)
  spawnflag NOMONSTER = 32;     // monsters cannot damage this breakable and/or spawning rubble will not damage monsters
  spawnflag TRIGGERONLY = 64;   // Can only be triggered, no direct damage
  spawnflag NOROTATE = 128;     // Spawning rubble has No Y rotation
  string target, target2;       // Additional targets to fire when breakable is dead/used (only used once)
  float style;                  // pre-defined sound/model types - 1=rock, 2=wood, 3=glass, 4=metal, 5=brick, 6=ceramic, 10=custom
  float brksound;               // Initial breaking sound type (override style default)
  float brkimpsound;            // Impact sound type (override style default)
  float brkobjects;             // Breakable object model type (10-15=rocks, 20-22=woods, 30-32=glass, 40-43=metals, 50-54=brick, 60=ceramic)
  string noise;                 // Initial breaking sound (unique sound file)
  string noise1 - noise4;       // Impact sounds (unique sound files, must have 1 defined)
  string brkobj1 - brkobj4;     // Breakable objects (unique models, must have 1 defined)
  float health;                 // amount of damage to take before breaking (def 1)
  float count;                  // minimum quantity to spawn (def 4)
  float cnt;                    // random quantity to spawn (def 4) =-1 no random qty
  float dmg;                    // explosive radius damage (emits from center of func object)
  vector pos1;                  // x=start particle colour, y=random range, z=quantity
  vector brkvelbase;            // Base amount for velocity of broken parts (def based on style)
  vector brkveladd;             // Random additions for velocity of broken parts (def based on style)
  vector brkavel;               // Amount of breaking object angle velocity (def 200)
  float brkfade;                // Fade time before rubble fades away (def 4+random()*4)
  float brktrigjump;            // Trigger if damaged by jumping monster attack
  float brktrigmissile;         // Trigger if damaged by - rocket/grenade/shalball
  float brkgravity;             // Change the gravity for rubble, useful for underwater (Value = 0-1)
func_breakable_spawner          // Spawn breakable ojects from a single point
  vector brkvol;                // Spawning volume vector for breakable point entity                      
                                // Always starts off, has all the same parameters as func_breakable, can fire multiple times
func_breakable_wall             // Switchable bmodel for breakable setups with optional collision
  spawnflag START_ON = 1;       // Will spawn visible and wait for trigger
  spawnflag SOLID = 2;          // Will block player/monster movement
  spawnflags FADEOUT = 4;       // Will fade out after a certain amount of time if visible!
  string targetname;            // must be defined otherwise will be removed
  float wait = -1;              // trigger once only, cannot toggle state
  float waitmin;                // random time to wait before fading out
trigger_monsterbreak            // Trigger breakable and monster together
  spawnflag NODELAY = 1;        // No delay between monster and breakable trigger
  spawnflag WAKEANIM = 2;       // Will do special wakeup animation when triggered
  string targetname;            // activating trigger points to this
  string target;                // points to func_breakable (single target)
  string target2;               // points to a monster (single target)
  float wait;                   // time before breakable is triggered (def 0.2)


==============================================================================
Particle System
---------------

The particle system is OFF by default because it can easily bring a Quake
engine to its knees with over use. When the system is active it will create
a large bank (1000) of particles to minimize entity thrashing. All requests
for a particle goes through a single system that does all the work fetching,
re-using and configuring all particles ready for use.

The system comes in two different flavours (pixel sprites and alpha textures)
which are automatically switched between when the correct engine is detected.
This allows for one map to work with multiple clients and minimalize the
effort invovled in getting a map looking good with multiple engines.

There are several predefined particle setups which can be triggered via a 
'misc_particle' entity or if they are not right a new particle can be setup
with the template system that copies all of its settings to any particle
entity that targets it when the map starts.

Quake does come with a small set of builtin particle effects that are used
throughout the game by monsters or map specific events. Using the new entity
'misc_builtineffects' the ID effects can easily be triggered.

The Darkplaces engine uses alpha texture particles which allows for one of
the best kind of particles, smoke! The new entity 'misc_smoke' is designed
to take advantage of that with multiple colours, different spread patterns
and velocity directions.

Particle entity details
------------------------------------------------------------------------------
misc_particle                   // Spawn a particle emitter
  string target;                // destination of effect (self -> target)
  string target2;               // name of a particle template
  string message;               // Particle style string (upper case) leave blank for custom
                                   ARMOR1, ARMOR2, ARMOR3, BOOK, ELECTRIC, FCIRCLE, 
			                       FLAMES, FLAMEL, KEYGOLD, KEYSILVER, MEGAH, PENT,
			                       PORTAL, QUAD, SIGIL, SKILL, SRING, SUIT
misc_particletemplate           // A particle emitter template
  string targetname;            // target name reference for misc_particle entities
  string spr_name1;             // sprite name (def=progs/s_bubble_blue1.spr)
  string spr_name2;             // sprite name (def=progs/s_bubble_wht.spr)
  string spr_name3;             // sprite name (def=progs/s_dotmed_grey.spr)
  float part_movetype;          // Movetype of particle (def=8, check defs.qc)
  float part_limit;             // Maximum amount of particles to emit at once (def=25)
  float part_life;              // Life time (seconds) particle is active (def=1)
  vector part_ofs;              // Offset from emitter (def='0 0 0' XYZ vector)
  float part_veltype;           // Velocity type 1=random, 2=circular 3=center (def=3)
  vector part_vel;              // Velocity direction (def='8 8 8' XYZ vector)
  vector part_velrand;          // Extra random velocity (requires part_veltype=1)
  float part_velrot;            // Velocity rotation (Y axis only)
  vector part_vol;              // Spawning volume around emitter (XYZ vector)
  float wakeup_dist;            // Wake up distance for particle emitter (def=1024)
  float wakeup_timer;           // How often to check distance time (def=1)
  float spawn_base;             // Spawn rate time - base value (def=0.1)
  float spawn_rand;             // Spawn rate time - random adjustment (def=0)
  float dpp_name;               // DP particle effect name in effectinfo.txt file (def="")
  float dpp_wait;               // DP particle re-trigger timer (def=0.1)
  float dpp_rnd;                // DP particle random multiplier for time (def=0)
  float dpp_vel;                // Direction of DP particles to move towards (XYZ)
misc_particle_burst;            // A particle emitter that fires a burst
  string part_ofs;              // Particle Origin Offset (def='0 0 0')
  float part_tcount;            // Particle Quantity (def=20)
  float part_life;              // Particle Life Time (def=2s)
  float part_style;             // 1=yellow, 2=green, 3=red, 4=blue, 5=purple, 6=fire, 7=white
  float part_movetype;          // 2=center, 3=up, 4=shockwave, 5=skull, 6=lost, 7=minotaur
misc_builtineffects             // Spawn a builtin particle effect
  string target;                // destination of effect (self -> target)
  float wait;                   // time between firing of effect (def=0)
  float delay;                  // random time between firing of effect (def=0s)
  float count;                  // type of effect to fire
                                   0=TE_SPIKE (def), 1=TE_SUPERSPIKE, 2=TE_GUNSHOT, 
		                           3=TE_EXPLOSION (sprites), 4=TE_TAREXPLOSION (purple ver)
		                           5=TE_LIGHTNING1 (Shambler ver), 6=TE_LIGHTNING2 (Player ver)
		                           7=TE_WIZSPIKE, 8=TE_KNIGHTSPIKE, 9=TE_LIGHTNING3 (boss ver)
		                           10=TE_LAVASPLASH (boss wakeup), 11=TE_TELEPORT (sparkles)
misc_smoke                      // special smoke model with multiple skins
  spawnflags NODPMDL = 2;       // Do not draw smoke model in DP engine
  spawnflags NODPFX = 4;        // Do not draw any DP particle effects
  string target;                // targetting entity used for custom direction
  float exactskin;              // 0=Gunsmoke, 1=Soot, 2=Steam, 3=Toxin, 4=Plague, 5=Incense, 6=Lithium, 7=Flames
  vector angles;                // 'pitch roll yaw' up/down, angle, tilt left/right 
  float alpha;                  // Smoke is generally transparent (def=0.65)
  float wait;                   // time between generation of smoke particles (def=0.1, min=0.01)
  float delay;                  // random amount of time delay ( time = wait + delay x random() )
  float height;                 // Percentage of velocity distance travelled (def=1, range=0-1+)


==============================================================================
New/Updated Monsters
--------------------

New keys for All monster
------------------------------------------------------------------------------
spawnflag AMBUSH = 1;           // Ambush (will only wakeup if see the player)
spawnflag SILENT_WAKEUP = 8;    // No wakeup sight sound
spawnflag SPAWN_NOIDLE = 16;    // no idle sounds (cupboard monster)
spawnflag SPAWN_NOGFX = 32;     // No spawn effect or sound
spawnflag SPAWN_DELAY = 64;     // Will wait for trigger before spawning
spawnflag SPAWN_ANGRY = 128;    // When spawning will be angry at the player 
string target;                  // Primary target field for trigger events
string target2;                 // Secondary target field (additional fires)
string angrytarget;             // target name to get angry at when spawning
string deathtarget;             // Alternative target to fire when dying
float health = 1-x;             // Override default health defined in QC
float exactskin = 0-x;          // Override default skin (no range check)
float upgrade_axe = 1;          // Only spawn if player has got upgrade Axe
float upgrade_ssg = 1;          // Only spawn if player has got upgrade Shotgun
float upgrade_lg = 1;           // Only spawn if player has got upgrade Lightning Gun
float nomonstercount = 1;       // Will not count towards map monster total
float infightextra = 1-x;       // Damage multiplier when infighting
float pain_ignore = 1;          // Will ignore pain frame when infighting
float noinfighting = 1;         // Will ignore all requests to infight
float no_liquiddmg = 1;         // Blocks all liquid (slime/lava) damage checks
float no_zaware = 1;            // Z Aware projectiles will be disabled
float bboxtype = 1-10;          // 1=Tiny,4=Short,5=Tall,7=Wide,8=Giant,10=Massive 
float gibondeath = 1;           // Will always explode into gibs on death
float bodyfadeaway = 1-x;       // Time in seconds before body/head fades away
float movespeed = -1/0/1;       // =-1 no movement(turret), =0/1 free movement
float turrethealth = 0-1;       // % of HP when monster turret is released 
string turrettarget;            // Target(s) to fire when turret % HP is released

Zombies (regular + knight)
------------------------------------------------------------------------------
spawnflag CRUCIFIED = 1;        // Zombies - start in crucified position (regular only)
spawnflag AMBUSH = 2;           // Ambush (will only wakeup if see the player)
spawnflag ONFLOOR = 4;          // Zombies - spawn lying on the floor
float angle = 0, 1-360;         // 0=random lying down angle, 1-360=specific

Skull Wizards
------------------------------------------------------------------------------
float bodyphased;               // Starting body state; 0=solid, 1=invisible
float height;                   // Maximum teleport destination height (def=96)
float distmin;                  // Minimum amount for teleport distance (def=256)
float distmax;                  // Random amount to add to teleport distance (def=512)

Stone Statues (Knights/Hell Knights)
------------------------------------------------------------------------------
spawnflag MON_STATUE = 2;       // Convert monster to a stone statue (frozen)
spawnflags MON_NOTFROZEN = 4;   // Will start not frozen (works with statue)
string targetname;              // Will not spawn if targetname is missing
float frame = x;                // Statue pose (default knight=44, hellknight=73)
vector pos1;                    // X->Y, Z=0 ; Idle animation range to pick from

Mummy, Green Spider and Minotaur
------------------------------------------------------------------------------
float poisonous = -1;           // Will no longer apply poison debuff to projectiles

New Keys for SPECIFIC monster
------------------------------------------------------------------------------
spawnflag HOGREMETAL = 4;       // Hunter Ogre - upgraded metal skin and +HP
spawnflag OGREGREEN = 4;        // Green Ogre - upgraded skin and +HP
spawnflag SPIDERLARGE = 2;      // Spider - Green range variety, greater HP
spawnflag SPIDERCEILING = 4;    // Spider - Will start on the ceiling
spawnflag VORELINGCEILING = 4;  // Voreling - Will start on the ceiling
spawnflag GARGOYLESTATUE = 2;   // Gargoyle - A stone version of perch abilty
spawnflag GARGOYLEPERCH = 4;	// Gargoyle - Will start in a perch position
spawnflag GAUNTPERCH = 4;	    // Gaunt - Will start in a perch position

spawnflag MINOTAURMINIONS = 4;	// Minotaur - Spawn brown gargoyles
spawnflag SHALRATHMINIONS = 4;	// Shalrath - Spawn little vorelings
spawnflag SKULLWIZGUARDIAN = 2; // Skull Wizard - special rune setup
spawnflag SKULLWIZMINIONS = 4;  // Skull Wizard - Spawn lost souls
spawnflag WRAITHSCORPIONS = 2;	// Wraith - Will Spawn brown/green scorpions
spawnflag WRAITHSPIDERS = 4;	// Wraith - Will Spawn brown/green spiders

spawnflag DCROSSTRACK = 4;      // Crossbow knights will velocity track enemies
spawnflag JIMROCKET = 4;        // Robot Jim - fires rockets and has lower health
spawnflag BLACKSTINGER = 4;     // Scorpion - Deadly poison debuff sting attack
spawnflag TARBYLESSJUMP = 4;    // Tarbaby - Will not constantly jump around
spawnflag ALWAYSABOVE = 4;      // Wizard - Will always maintain height above enemies
spawnflag GOLEMSTATUE = 2;      // Golem - Will start as a statue, wait for trigger

NEW monsters
------------------------------------------------------------------------------
monster_spider (30/75HP)        // Erratic arachnids in brown/green variety
monster_voreling (30HP)         // Ankle biting, crazy jumping, mini shalraths
monster_lostsoul (30HP)         // Floating skull with a ram/bite attack
monster_dguard (35HP)           // Medieval style soldier replacement (melee only)
monster_zombiek (60HP)          // Sword wielding zombie, fast movement (melee only)
monster_dcrossbow (75HP)        // Chainmail knight with crossbow (sniper ability)
monster_gargoyle (120HP)        // Large flying fireball throwing imp (range only)
monster_gaunt (120HP)           // Flying plasma wielding harpy creature (range only)
monster_scorpion (80/120HP)     // Brown/green range stinger and black jumping surprise
monster_skullwiz (120HP)        // Tall wizard with fast skull missiles and teleportation
monster_hogre (200HP)           // Ogre Hunter model replacement (extra melee)
monster_hogremac (200HP)        // Alternative ogre model with mace weapon
monster_hogreham (300HP)        // Heavy metal ogre model with hammer attack
monster_dknight (250HP)         // Hell Knight model replacement (classic silver)
monster_wraith (300HP)          // Semi-transparent wraith with debuff attacks
monster_dfury (400HP)           // Fast sword wielding knight with magic attacks
monster_dsergeant (400HP)       // Blue Flail knight with homing missiles
monster_drole (500HP)           // Large tentacle tank with rocket/melee attacks
monster_minotaur (500HP)        // Giant hulk with fast plasma/poison attacks
monster_golem (500HP)           // Massive moutain of rock with large fists and feet

monster_army_rocket (45HP)      // Red armour heat seeking rocket soldiers 
monster_army_grenade (60HP)     // Green armour Z aware grenade firing soldiers
monster_army_plasma (75HP)      // Blue armour high damage plasma gun soldiers
monster_pyro (100HP)            // Yellow armour flamethrowing enforcer (burn defuff)
monster_jim (50/100HP)          // Fast moving flying laser/rocket robot 
monster_defender (100HP)        // Dual wielding SSG (melee range) and GL (mid range)
monster_eliminator (120HP)      // Blue armour double firing plasma gun enforcers
monster_centurion (120HP)       // Flying hover board plasma gun enforcers

Monster Infighting Groups (Can only be change in QC)
------------------------------------------------------------------------------
Soliders            (4) monster_army, _army_rocket, _army_grenade, _army_plasma
Enforcers           (5) monster_enforcer, _defender, _pyro, _eliminator, _centurion
Demons              (3) monster_demon1, monster_drole, monster_minotaur
Dog                 (1) monster_dog
Fish                (1) monster_fish
Robots              (1) monster_jim
Knights             (3) monster_knight, _dguard, _dcrossbow
Hell Knights        (2) monster_hell_knight, monster_dknight
Knight Captains     (2) monster_dfury, monster_dserg
Stone               (3) monster_hell_knight (statue), _knight (statue), _golem
Ogre                (4) monster_ogre, _hogre, _hogremac, _hogreham
Arachnids           (4) monster_shalrath, _vorling, _wraith, _spider, _scorpion
Shambler            (1) monster_shambler
Tarbaby             (1) monster_tarbaby
Wizard              (4) monster_wizard, _gargoyle, _gaunt, _skullwiz, _lostsoul
Zombie              (3) monster_zombie, _zombiek, _mummy
Boss                (1) monster_boss

monster_army (_rocket, _grenade, _plasma)
------------------------------------------------------------------------------
Low health cannon fodder with various weapon upgrades and different coloured
armour to fill up early base levels with. The rocket version has a small amount
of target seeking, the grenades are Z aware and the plasma is high damage!

monster_enforcer (_defender, _pyro, _eliminator, _centurion)
------------------------------------------------------------------------------
A large battalion of dual shock defenders, high burst plasma elinators, floating
high centurions and firey flamethrowing enforcers. With a gradually inclining range
of HP bars and jigsaw like large pack encounter designs, this is a formidable 
front line defence force!

monster_jim
------------------------------------------------------------------------------
A fast moving flying robot that can easily avoid players projectile attacks
with a special upward move and still keep firing lasers or rockets. The speed
of the projectiles and movement are linked to skill levels which can be a
challenge when encountered in large packs.

monster_zombiek
------------------------------------------------------------------------------
A slow moving zombie with a knight sword in one hand and counter balance club foot.
Has a small leap forward when close to the player and requires large hit damage to die.
Designed to be lurking in the shadows or part of a pack of monsters as it is good
at applying pressure to an already active combat situation. Can start/spawn
lying down and then be triggered later.

monster_spider
------------------------------------------------------------------------------
The brown (default) spider is melee only and will erractically move towards
the player with a tame jump attack for close encounters. The green (large)
spider prefers to stay at range and spit at the player with 3 blobs of acid.
The spit function will track the player and is ZAware.

The spider bite is low damage 1-3 per 5 frames with a special frenzy attack. This
can be lethal in large groups as the spider also pushes forward at the same time.
The jump attack is 5-10 damage, half that of a dog. Can be setup to spawn on
the ceiling and triggered to drop on unobservant players.

monster_scorpion
------------------------------------------------------------------------------
The brown/green (default) scorpion is very slow moving and prefers to throw
acid coloured spikes at the player. A low health enemy with an easily dodged
range attack, but a lethal claw melee attack.

The black version is much tougher on health and will jump extremely quickly
at the player with a deadly poison tail sting. The players health will be
reduced by 50% each sting and gradually restore back 5HP per second afterwards.
Best setup in very dark corners ready for any unsuspecting players, produces a
very distinct idle sound designed to induce fear of attack.

monster_voreling
------------------------------------------------------------------------------
Mini three legged ankle biting vorelings are fast moving with a small sized
jump and frenzy bite attack for snacking. They speed up and slow down while
they run and will often pause if at distance from the player. They have very
low health and are designed to be encountered in packs. Can be setup to spawn
on the ceiling and triggered to drop on unobservant players.

monster_dguard
------------------------------------------------------------------------------
A medieval version of the 'monster_army' unit with low health and knight like
melee damage. Good for starting areas and general filler to existing groups.
Designed to be an easy introduction to the Death Brigade with knight movement. 

monster_dcrossbow
------------------------------------------------------------------------------
A cautious range unit with high damage bolts and a strong melee attack. The
bolts are variable speed based on skill level and are designed to force the player
to strafe or seek cover. The health bar can easily be taken down with NG+ weapons, 
but SG\SSG will struggle because of reload times.

When the player is within melee range the unit will use the crossbow as a club
and as soon outside of range straight away fire a bolt for a quick hipshot.
Unlike most monsters in Quake the crossbow knight will not immediately follow
the player but rather wait and keep distance.

It is recommended to place these units around sharp corners (90 degree)
or up on ledges overlooking areas. The crossbow knight does not follow the
same way as other quake units and needs to be in position first.

monster_gargoyle
------------------------------------------------------------------------------
A tough flying unit with a single range attack (fireball) that prefers to keep
its distance from ground enemies. The fireball does 25% damage compared to a
player rocket with direct and splashdamage to encourage infighting.

The gargoyle will always try to maintain height above its enemies to reduce
melee damage and works best when in areas with high ceilings. If the enemy
is within close range, will fire rapid shots instead.

monster_gaunt
------------------------------------------------------------------------------
A large Cthulhu like Pterodactyl with an creepy calling sound and the ability
to transmute electricity into fast moving bolts of plasma. Will always hover
above the player and can be setup in a perch state for surprise attacks.

monster_hogre
------------------------------------------------------------------------------
A new model with greater detail and some armour pieces similar to the Hell
Knight. There are three different types; chainsaw, mace and hammer. Each
ogre can be upgraded (skin) with a new spawnflag that gives an extra HP boast.

The chainsaw version has an extra thrust attack which does +150% damage. The
mace ogre does high single strike attacks and the hammer version has a special
shockwave attack which lifts everything nearby off the ground.

monster_dknight
------------------------------------------------------------------------------
Model upgrade with more poly detail and standard attacks.

monster_dfury
------------------------------------------------------------------------------
A mid level monster with shalrath/demon like health bar that has five melee
attacks and two very quick firing magic attacks. Designed to jump close to
the player and use multiple quick sword swings for high damage. Will use
two types of magic attacks at mid to long range that have slow build up
animations that fire variable speed projectiles dependant on skill level.

The fury knight will easily work its way through a crowded room doing extra
damage against other monsters and using its over head smash attack for
visual affect. It has a high pain threshold for small impact damage, but
can be dealt with easily with SNG/GL/RL heavy attacks.

monster_dsergeant
------------------------------------------------------------------------------
A fast moving Blue Flail knight with shalrath homing missiles and heavy
single strike melee attacks. This unit will constantly charge the player if the
Z height is similar and if different keep send deadly homing missiles instead.
This is a mid level monster that is highly mobile, crushing up close and
will easily tear a path through any crowd to get its target.

The homing missiles have the same speed regardless of skill level. Originally
these were setup identical to the Shalrath with easy/normal/hard being different
to the nightmare skill level. During testing it felt like the missiles were
going faster than usual because the blue knight moves around so quick, this
is the reason the missiles use only one speed.

monster_wraith
------------------------------------------------------------------------------
A semi-transparent flying apparition with multiple range attacks that will
try to stay out of melee range and high above the player as much as possible.
The primary attack is a hitscan burning debuff that does direct fire damage
and then sets fire to the player with damage over time afterward.

The burning debuff will ignores all armour and is deflected by the Pentagram
of Protection and Environment Suit. The screen will flash orange every second
and a loud heartbeat sound can be heard in background while the health is
being drained. The player can use health packs to instantly stop the burning.

Once the debuff has been applied to the player the wraith will start attacking
with a burst of bones (nails) to keep the player pre-occupied with dodging.

The wraith is designed to be a support class monster that lurks in the
background helping an existing encounter by disorientating the player with
large fire attacks and slow burning damage.

monster_drole
------------------------------------------------------------------------------
A large hulking tank of tentacles with a tendancy to get angry at the player
with sometimes deadly results. This monster has two phases, the first is to
keep mid range distance and fire rapidly increasing fireballs. There is no
strafe mode but instead the monster will physically turn and walk around
to the side waiting for the cooldown on range attacks.

The second phase is the enrage at 70% health the drole will switch to a
very fast run attack (demon/fiend speed) and constantly try to pumel the
player with a wall of tentacles. The second phase is really to apply the
pressure to the player and make them panic.

monster_minotaur
------------------------------------------------------------------------------
An extremely tall demonic beast with a powerful melee attack and very fast
plasma/poison attack. This monster has two phases likes the drole and will
eventually switch to a very fast charge/melee attack when enraged.

monster_golem
------------------------------------------------------------------------------
A slow moving mountain of rock with giant fists and large feet that can easily
destroy any enemies that get too close. The Golem has several strong melee
attacks, one large radius ground shockwave attack and the ability to throw a
large volley of bone breaking rock debris.


==============================================================================
Minion System
-------------

This system is designed to work with specific monsters and spawn certain 
monsters, this is not a global function for all monsters. The idea is to create 
a support class, a strong HP monster that stays at mid range and keep spawning 
low health monsters that will create more chaotic encounter groups.

Minion spawning monsters on their own are easy to deal with, their spawning is
slow and they rarely use any kind of direct damage attack.  It is essential that
these monsters are placed at the edge of encounters so that any monsters they
do spawn can join the encounter easily.

The primary concern with the minion spawning mechanic is that the player can
eventually run out of ammo and the endless spawning can eventually crash the
engine. This is solved by two mechanics, a limit to how many minions are
active at once and trigger events based on quantity spawned so far.

The defaults can be changed by adding the following keys to the monster:
------------------------------------------------------------------------------
float minion_maxcount;          // Maximum amount of active minions (def=5)
float minion_maxtrigger;        // Spawn total for trigger event (def=5)
string miniontarget;            // targetname string for trigger event

Once the monster reaches the maximum active amount of minions it will go into
wandering phase of maintaining distance from the enemy and occasional (10%) use
a range attack so that it looks like it is doing something. The spawning monster
will not spawn any minions unless it can see the player.

The default throw parameters are quiet low (100-150 speed) and this can be
problem if the minion spawner is on a high ledge. The following parameters will
change the default throw distance and fix any stuck problems. 

How to change the throw speed of the ball/egg
------------------------------------------------------------------------------
float minion_throwspeed;        // Forward speed of ball to be thrown (def=100)
float minion_throwextra;        // Random forward momentum (def=50)
float minion_throwside;         // Random +/- sideways momentum (def=50)

If the player reaches gets within melee range there is a chance that the
minion spawner will revert to the monsters original base attack. This can be 
blocked with the following parameter, otherwise it is on by default.

------------------------------------------------------------------------------
float minion_baseattack = -1;   // Block base attack within melee range

Every minion spawning monster requires a special entity that must be added to
the map so that all the correct precache files are loaded. If the entity is not
present when the monster tries to spawn a minion, a dev console message will be
displayed and the monster will not spawn anything!

Here is a list of the new entities (named after spawning monster)

------------------------------------------------------------------------------
monster_minotaurminion          // Gargoyle precache for the Minotaur
monster_shalrathminion          // Vorling precache for the shalrath
monster_skullwizminion          // Lost Soul precache for the Skull Wizard
monster_wraithminion            // Spider precache for the wraith
monster_wraithminion2           // Scorpion precache for the wraith

The spawning minion function only works against the player, if the monster is
caught infighting it will revert to its typical range attacks until the
fight is over. Then it will switch back to the player and resume spawning.

Here is a list of available minion spawning monsters:

monster_minotaur
------------------------------------------------------------------------------
A large hulking demonic beast with strong melee attacks, large feet and the
chance to throw very fast plasma or poison bolts at the player. The dark brown
version loves to summon gargoyles out of thin air!

monster_shalrath
------------------------------------------------------------------------------
A classic ID monster with three legs, a rough voice and a tendancy to throw
homing missiles that love to chase players around tiny pillars. The darker
skinned version loves to throw baby voreling eggs at the player!

monster_skullwizard
------------------------------------------------------------------------------
A turret like dead wizard that fires powerful skull rockets and when 
the player is too close will teleport away to another location. The black
robe version loves to summon lost souls out of thin air!

monster_wraith
------------------------------------------------------------------------------
A semi-transparent flying apparition with multiple range attacks that will
try to stay out of melee range and high above the player. The dark skinned
version loves to throw baby scorpion/spider eggs at the player!


==============================================================================
Bounding Boxes
--------------

The quickest way to make the game harder is to change the size of bounding
boxes! All projectiles are tested against a monsters bounding box, which cannot
be rotated, is always centered on the model and XY square in dimensions because
of the rotation problem.

To view ingame bounding boxes use the console command 'r_showbboxes'

All of the bounding boxes have been tweaked to fit the models better, this
will affect how monsters move around (collision) and especially weapons that
have large projectile spread patterns (ie shotguns)

The monsters break down into several categories based on model sizes and
location (ground/air/water). Flying monsters usually have taller bounding
boxes so they can be hit easier from the ground.

Name                Category (   Min   ) (  Max  )  (  IDmin  ) ( IDMax ) Diff
------------------------------------------------------------------------------
Lost Soul           Tiny     -16 -16 -24  16 16 16  --- --- ---  -- -- --
Scorpion            Tiny     -16 -16 -24  16 16 16  --- --- ---  -- -- --
Spider (Br/Gr)      Tiny     -16 -16 -24  16 16 16  --- --- ---  -- -- --
Voreling            Tiny     -16 -16 -24  16 16 16  --- --- ---  -- -- --

Dog                 Dog      -20 -20 -24  20 20 16  -32 -32 -24  32 32 40  **
Fish                Fish     -16 -16 -24  16 16 24  -16 -16 -24  16 16 24

Player              Short    -16 -16 -24  16 16 32  -16 -16 -24  16 16 32
Knights             Short    -16 -16 -24  16 16 32  -16 -16 -24  16 16 40  **
Army (SG/GL/RL/PG)  Short    -16 -16 -24  16 16 32  -16 -16 -24  16 16 40  **
Death Guard         Short    -16 -16 -24  16 16 32  --- --- ---  -- -- --
Crossbow Knight     Short    -16 -16 -24  16 16 32  --- --- ---  -- -- --
Jim (Robot)         Short    -16 -16 -24  16 16 32  --- --- ---  -- -- --
Zombie              Short    -16 -16 -24  16 16 32  -16 -16 -24  16 16 40  **
Zombie Poisoned     Short    -16 -16 -24  16 16 32  --- --- ---  -- -- --
Zombie Knight       Short    -16 -16 -24  16 16 32  --- --- ---  -- -- --

Enforcer (LZ/GL/PG) Tall     -16 -16 -24  16 16 40  -16 -16 -24  16 16 40
Pyro                Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Centurion           Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Hell Knight         Tall     -16 -16 -24  16 16 40  -16 -16 -24  16 16 40
Death Knight        Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Fury Knight         Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Sergeant Knight     Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Gargoyles           Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Gaunt               Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Skull Wizard        Tall     -16 -16 -24  16 16 40  --- --- ---  -- -- --
Tarbaby             Tall     -16 -16 -24  16 16 40  -16 -16 -24  16 16 40
Wizard (Scrag)      Tall     -16 -16 -24  16 16 40  -16 -16 -24  16 16 40

* All monsters below this point have HULL2 bounding boxes against the world

Name                Category (   Min   ) (  Max  )  (  IDmin  ) ( IDMax ) Diff
------------------------------------------------------------------------------
Demon               Wide     -24 -24 -24  24 24 40  -32 -32 -24  32 32 64  **
Ogre                Wide     -24 -24 -24  24 24 40  -32 -32 -24  32 32 64  **
Hunter Ogre         Wide     -24 -24 -24  24 24 40  --- --- ---  -- -- --
Mace Ogre           Wide     -24 -24 -24  24 24 40  --- --- ---  -- -- --
Hammer Ogre         Wide     -24 -24 -24  24 24 40  --- --- ---  -- -- --
Shalrath            Wide     -24 -24 -24  24 24 40  -32 -32 -24  32 32 64  **
Wraith              Wide     -24 -24 -24  24 24 40  -16 -16 -24  16 16 32  **

Drole               Giant    -24 -24 -24  24 24 64  --- --- ---  -- -- --
Minotaur            Giant    -24 -24 -24  24 24 64  --- --- ---  -- -- --
Golem               Golem    -24 -24 -24  24 24 72  --- --- ---  -- -- --
Shambler            Massive  -32 -32 -24  32 32 64  -32 -32 -24  32 32 64

Boss                Boss   -128 -128 -24  128 128 256 
Oldone              Boss   -160 -128 -24  160 128 256

Quake maintains two types of collision, projectiles and world (geometry).
The QC can set the projectile collision (see above) but the world collision
is done via the engine. There are currently 3 types of world collision
called Hull 0, 1 and 2. 

Any monster that is wider than 32 units will have a Hull 2 collision which 
is the size of a shambler. This is why ogres, demons and shalraths often 
cannot fit through small doorways even though it looks like they can!


==============================================================================
New Weapons
-----------

Shadow Axe (SA)
------------------------------------------------------------------------------
The new axe is a visual upgrade (blood soaked model) which does +75% more 
damage, kills zombies and deals with low level monsters easily. To some
the axe has always been a novelity weapon, but there are plenty of Quake
players who love to dance around monsters cutting them down to size!

Weapon Dmg  2+  3+  4+  5+  6+  7+  8+  9+  10+ 11+ 12+ 13+ 14+ 15+
Axe     20  40  60  80  100 120 140 160 180 200 220 240 260 280 300
New Axe 35  70  105 140 175 210 245 280 315 350 385 420 455 490 525

Monster Health Axe Hits Time  NAxe Hits Time   Diff
----------------------------------------------------
Dog       25    40  +2  1.0s    35  +1  0.5s   +0.5s
Army      35    40  +2  1.0s    35  +1  0.5s   +0.5s
Knight    75    80  +4  2.0s   105  +3  1.5s   +0.5s
Wizard    85   100  +5  2.5s   105  +3  1.5s   +1.0s
Ogre     200   200 +10  5.0s   210  +6  3.0s   +2.0s
----------------------------------------------------
HKnight  250   260 +13  6.5s   280  +8  4.0s   +2.5s
Demon    300   300 +15  7.5s   315  +9  4.5s   +3.0s
Shalrath 400   400 +20 10.0s   420 +12  6.0s   +4.0s
Shambler 600   600 +30 15.0s   630 +18  9.0s   +6.0s

With the increased damage, many of the low level monsters are now one hit
wonders and several of them will now play long pain animations when attacked
with the new axe to allow the player time to get in extra 2nd/3rd fatal hit.
(dcrossbow, enforcer, hogre, knight, ogre, wizard do long pain animations)

The primary benefit of the new axe is against zombies, one hit will often
knock them down to the ground and another will deal with them on the ground.
This also applies to all bodies lying on the floor, so observant players can
preempt traps by dealing with bodies on the floor first.

The Widowmaker (WM)
------------------------------------------------------------------------------
This is an upgrade to the Super Shotgun (SSG) and does +50% more damage, but
uses +50% more shells (3 per shot). The WM spread pattern is identical to the
SSG and there are now 21 pellets instead of 14 fire every 7 frames.

Weapon Pellets Dmg Total  2+  3+  4+  5+  6+  7+  8+  9+ 10+ 11+
SG        6     4   24    48  72  96 120 144 168 192 216 240 264
SSG      14     4   56   112 168 224 280 336 392 448 504 560 616
WM       21     4   84   168 252 336 420 504 588 672

Monster Health SSG Shots Ammo Time    WM Shots Ammo Time   Diff
---------------------------------------------------------------
Army      35    56  +1    2   0.7s    84  +1    3   0.7s   -.-s
Zombie    60    56  --    -   -.-s    84  +1    3   0.7s  +0.7s
Knight    75   112  +2    4   1.4s    84  +1    3   0.7s  +0.7s
Wizard    80   112  +2    4   1.4s    84  +1    3   0.7s  +0.7s
Gargoye  120   168  +3    6   1.4s   168  +2    6   1.4s  +0.7s
Ogre     200   224  +4    8   2.8s   252  +3    9   2.1s  +0.7s
HKnight  250   280  +5   10   3.5s   252  +3    9   2.1s  +1.4s
---------------------------------------------------------------
Demon    300   336  +6   12   4.2s   336  +4   12   2.8s  +1.4s
Shalrath 400   448  +8   16   5.6s   420  +5   15   3.5s  +2.1s
Shambler 600   616  +11  22   7.7s   672  +8   24   5.6s  +2.1s

The WM is designed to be effective against mid range monsters (demon/shalrath)
and less effective against single low level monsters (knight/wizard). This gives
the player more high damage weapon/ammo choices (shells/nails) and extra time to
deal with more powerful enemies quickly. With the same spread pattern as the SSG
and higher damage output the RG can easily deal with multiple small monsters.

One side effect of the higher damage (84) is that the weapon can effectively
kill zombies with one hit and is an ideal early weapon alternative to the GL/RL.

The greatest concern with the WM is the ammo consumption, especially if the 
player is missing many shots or catching the sides of bounding boxes. Extra 
boxes of shell ammo should be setup to delay spawn (via extra keys) if the 
player has the item in their inventory.

Plasma Gun (PG)
------------------------------------------------------------------------------
This is an upgrade to the Lightning Gun with extra (splash) damage, the
ability to plasma climb walls and no instant death if fired in water.

Weapon    Direct  Splash  Speed  Refire   Damage
---------------------------------------------------
Lightning   30       0      -      0.10     300
AD Plasma   45      20     900     0.20     325
---------------------------------------------------
Doom        5-40     0     875     0.086   58-465
Doom3       16       0     700     0.125    128 
Quoth        0      50    1000     0.20     250


==============================================================================
Weapon Upgrade Parameters
-------------------------

This MOD contains several ways to give or take weapon upgrades from the
player during the various stages of the map loading process. 

Stage 1 - TEMP1 in Quake.rc
---------------------------

The temp1 variable in quake.rc has the following parameters:

8192    Turn ON Axe Upgrade, +75% dmg, gib zombies
16384   Turn ON SSG Upgrade, +50% dmg, uses 3 shells
32768   Turn ON LG Upgrade, Plasma projectiles + Splash Damage

Enabling these parameters DOES NOT give the player the upgrade weapon,
it will upgrade the original weapons in any map. For example, if the player
finds the Super Shotgun in a map it will automatically be upgraded to the 
Widowmaker Shotgun instead.

These options are designed for players who want to enjoy maps which don't
have the weapon upgrades entities present, like for example ID maps.

Stage 2 - Worldspawn
--------------------

The worldspawn entity of a map has the following parameters:

upgrade_axe  Upgrade Axe -1=remove, 1=enable
upgrade_ssg  Upgrade Super Shotgun -1=remove, 1=enable
upgrade_lg   Upgrade Lightning Gun -1=remove, 1=enable

Not every map is designed for the upgraded weapons and by using the
worldspawn entity, mappers can decide if the upgraded weapons are given
or taken away when the map is started.

These worldspawn parameters will OVERRIDE the temp1 key and any
existing inventory if the player has come from another map. These
parameters will also change the server flags for original weapons
to be upgraded and triggers for special spawn conditions.

Stage 3 - Worldspawn II
-----------------------

The worldspawn entity also has the following parameters:

give_weapons  Bit flag for which weapons to give to the player
take_weapons  1=SG, 2=SSG, 4=NG, 8=SNG, 16=GL, 32=RL, 64=LG (excludes Axe)

These worldspawn parameters are designed to give exact weapon loadouts
to a new player starting a map. There are also parameters for ammo, health
and armour to customize the player inventory further.

The take weapon command will remove upgraded weapons if the base weapon is
removed by these parameters. For example, if the map removes the SSG, then
the Widowmaker upgrade will be removed at the same time.

Stage 4 - Impulse Commands
--------------------------

These impulse commands are avilable when developer mode is enabled:

Impulse 200   Upgrade Axe (alias = "upgaxe")
Impulse 205   Upgrade SSG (alias = "upgssg")
Impulse 210   Upgrade LG  (alias = "upglg")

These impulse commands are toggles that will add/remove the relevant
weapon upgrade. These weapons are not part of impulse 9 which is the
general cheat function used for testing.


==============================================================================
Ammo Resistance
---------------

I always thought it was odd that the Shambler had 50% resistance to all
rockets. This was never visually shown or hinted at in the game besides the
manual warning about it! I am sure there were plenty of players who never
realized this 'feature' existed.

I am sure some people will scream that a RPG style resistance system has
no place in Quake and maybe they are right, but unfortunately there is 
an exception to the rule, the Shambler!

In an effort to resolve this visual problem a few monsters (high tier)
now have ammo resistance to encourage the player to use different weapons
and manage / collect more ammo types. This is also something a designer
needs to be aware of when balancing a map involving these monsters.

The Shell and Nail visual resistance is shown with a mixture of red and
grey impact particles, a ricochet sound, various smoke chunks flying off
in random directions and the monster screaming in pain.

The Rocket and Cell visual reistance is shown with a small puff of smoke,
a different rocket sound, small gibs of flesh (blood particles look odd),
various smoke chunks flying off in random directions and a monster scream.

When a monster is hit with a projectile and they have ammo resistance they
will ALWAYS ignore pain and not go into any pain animations.

Name                Shells  Nails  Rockets  Cells   HP  Effective
------------------------------------------------------------------
Drole                 50%    ---     ---     ---    500   1000
Golem                 ---    50%     ---     ---    500   1000
Minotaur              ---    ---     ---     50%    500   1000
Shambler              ---    ---     50%     ---    600   1200

Stone Knight          ---    20%     ---     ---     75     94
Stone Hell Knight     ---    20%     ---     ---    250    313

Defender              ---    ---     50%     ---    100    200
Eliminator            ---    ---     ---     50%    120    240
Pyro                  ---    50%     ---     ---    100    200


==============================================================================
MOD Features
------------

* New breakable system with 4 different material styles (model+sounds)
* New sprite based particle system added to most items/monsters/models
* New player debuff system with DoT/Poison/Burning effects over time
* New minion spawning system to allow for more dynamic encounter design
* New gib system with unique body parts for most monsters (blood/poison/stone)
* All monster projectiles are variable speed based on player skill level
* Zaware projectile ability added to some existing/new monsters (low grav aware)
* Two new powerups Sharpshooter and Nail Piercer to work with existing powerups
* MOD settings are maintained between map loads and remembered by savegame
* New HUB/Start map spawning system, can return to 7 unique spawn locations
* New re-spawning system for any item with particle effects and extra options
* Entity state system for switching entities to exact states (on/off/disable)

* The following changes affect ALL monsters:
  + can be setup to spawn when triggered and angry at unique target
  + are affected by liquid damage (slime/lava) check done at feet of model
  + have unique idle and sight sounds setup including during combat
  + sightchecks can changed based on water alpha values (water=1;solid)
  + will check the first 3 death frames for additional damage (LG/SNG)
  + have access to better infighting parameters (focus, pain, damage)
  + all melee attacks check z axis (+/- 64) as well as XY axis distance
  + the speed of range attacks are based on skill level (org base value=hard)
  + will detect and destroy breakable entities in the way (if spawnflags allow)
  + Delayed monster/items can check inventory for new Shotgun/Axe/PlasmaGun
  + new footstep sound system which supports two different feet sounds
  + can be turn into a turret (no movement) with % HP release condition

* monster_dguard, _dcross, _ dfury, _sergeant; new death series of knights
* monster_hogre, _hammer, _mace; new hunter series of ogres (more armour)
* monster_knight/hell_knight stone statue option, need trigger to come alive
* monster_zombiek with slow melee attacks and small leaps, can start lying down
* monster_zombie with extra skins for variety and can start lying down
* monster_demon has extra claw and jump checks (height/blocked)
* monster_dog, monster_knight, player, monster_solider new higher detail models
* monster_fish solid state and death counter fixed
* monster_wizard has option to maintain extra height above the player
* monster_gargoyle has independant height target and enemy target
* monster_gaunt is a large pterodactyl creature which fires plasma bolts
* monster_spider with low health and two variants (brown=melee and green=range)
* monster_wraith with health debuff/nail attack, optional minion spawning
* monster_shalrath with extra skins, new effects and optional minion spawning 
* monster_voreling with low health, small jump and bite/frenzy melee attacks
* monster_drole is a high health tentacle tank with dangerous range/melee attacks
* monster_minotaur is a high health stalking giant with lethal range/melee attacks
* monster_golem is a high health mountain of rock with deadly melee attacks

* func_door has new custom keys and alternative textures on open/close states
* func_train can be nonsolid / models and forward / backward with path_corners
* func_bob bmodel with gently bobbing motion based on angle and new parameters
* func_laser bmodel with damage/block abilities, has on/off/toggle states and sounds
* func_skill bmodel with touch/move functionality, keeps checking skill level
* misc_drip spawns water drip, can be delayed and has special water impact checks
* misc_fireball can be delayed, has variable waits and liquid impact sounds
* misc_model can be added to maps for extra detail (frame/skin/delay/collision)
* misc_shake affects the player/screen, added on/off/toggle states and sounds
* misc_smoke unique model with multiple skins, alpha and ON/OFF states
* misc_spark spawns shower of sparks, has on/off/toggle states and sounds
* misc_explobox/box2 exploding models, added delay/float/dmg/health options
* Multi, Once and secret trigs can check inventory for new Shotgun/Axe/PlasmaGun
* Added all predefined trigger sounds to trigger_once, multi and secret
* trigger_changelevel can be linked to 7 different spawn locations in next map
* trigger_fog changes global fog parameters (density/red/green/blue) over time
* trigger_heal function for creating healing pools or generic healing functions
* trigger_hurt can be delayed and setup to only affect monsters instead
* trigger_ladder can be climbed vertically, has on/off/toggle states and sounds
* trigger_monsterjump can be delayed and only work with certain monster types
* trigger_monsterturret will temporarily turn a range monster into a turret
* trigger_rune can test and fire multiple triggers based on runes collected 
* trigger_setskill can be delayed or triggered to change console skill level
* trigger_teleport can start off and have active sound linked to status (on/off)
* trigger_void can safely remove all/or specific entities upon contact
* Trap shooters upgraded to fire spikes, greandes, rockets, lightning and gas
* Trap shooters require constant trigger to work, have toggle on/off mode as well
* Trap shooters can also track moving targets (func_trains) while firing
* Trap buzzsaw/pendulum models (originally Rogue software) more setup options
* Path_corner system upgrade to support wait/delay and multiple routes
* Extra information (arrow models) for path_corners in developer mode
* QS has changed the SV_AIM default, console variable overrides mod settings
* Can cycle through all info_intermission camera(s) on final screen
* Will trigger events when info_intermission cameras are viewed through
* Will trigger events on most info_player spawn locations when used

* New health models (15/25/100) flasks for medieval/metal and boxes for base worlds
* New ammo box pickup models, multiple skins for world type (medieval/base)
* Shells/Spikes ammo boxes have special lid model while rocket/cells have alt frames
* New alternative ammo box item_plasma, give cells, has mutiple frames for diff look
* Cannot pick up any items when notarget is active (testing purposes)
* All keys (base/medieval/runic) and artifacts replaced with better skin/uv versions
* Custom key models (circuit board/base/medieval/runic) available with multiple skins
* All monster/player projectiles updated with better skin/uv setups
* Plenty of extra gib models dropped from monsters (swords, chainsaw, GL)
* Armour model (green/yellow/red skins) has been upgraded with more details
* New misc models added (candle, flame, drips, keys, sparks, smoke)
* New random rotation feature to ammo, health items, flames and candles
* Change the defaults of the MOD with new worldspawn keys:
  + can change item offset and use central rotation point
  + can add/remove player inventory items: weapons, ammo, health and armour
  + can add/remove new shotgun/axe/plasmagun upgrades from inventory 
  + can change Zaware range parameter for monsters (ogres/zombies)
  + can change the wateralpha (will remain active after finished map)

* Added upgrade to Axe (Based on new axe by MatthewB, new models/sound)
* Added upgrade to Super Shotgun (The Widowmaker by slapmap, new models/sound)
* Added upgrade to Lightning Gun (The PlasmaGun by slapmap, new models/sound)
* The Axe/Shotgun/LightningGun upgrades can knockdown down or kill zombies
* Added option to toggle Shotguns between hitscan and projectile bullets
* When projectile shells or Shotgun upgrade active, Shotgun sounds are replaced
* Added shell casings and particle effects for projectile pellets
* Shotgun/Nailguns have separate muzzle flashes to stop interpolation errors
* Plasma Gun will not discharge when underwater like LG, will not fire instead
* Plasma Gun has 10% chance on a fatal hit (HP<0) to blow up target

==============================================================================
MOD Resource Credits
--------------------

CODE
* QC codebase by Simon OCallaghan (highlighted in QC files if otherwise)
* Started with a Clean QC template based on 1.06 (Cleaned up by AndrewD)
* Additional QC support and loads of helpful advice by CoreyJ
* effectinfo.txt created by SimonOC, with advice and support from Seven
* particlefont.tga created by SimonOC, with support from LordHavoc
* trigger_fog inspired by Honey and misc_stream inspired by Rubicon2
* Inspiration for the new gib system, Marchers Fortress by BenW
* All new GIB models, keys, powerups, projectiles and ammo boxes by SimonOC
* Z aware functionality for ogres/zombies based on code by AndrewD
* misc_shake, misc_drip from RRP, trigger_ladder, func_laser from Rubicon2

MONSTERS
* mon_hogre.mdl, h_hogre.mdl by SimonOC/CoreyJ (hell knight style armour)
* mon_hogremac.mdl, mon_hogreham.mdl by SimonOC/CoreyJ (extra variety)
* mon_knight.mdl, h_knight.mdl by MatthewB (stone skin = Rogue Software)
* mon_dguard.mdl, h_dguard.mdl, mon_dknight.mdl, h_dknight.mdl by SimonOC/CoreyJ
* mon_hknight.mdl, h_hellkn.mdl by ID Software (stone skin by Rogue Software)
* mon_ogre.mdl, h_ogre.mdl by ID Software (Green skin by Rogue Software)
* mon_dfury.mdl, h_dfury.mdl and mon_dfury_glow.mdl by SimonOC/CoreyJ
* mon_dsergeant.mdl and w_blueflail.mdl by SimonOC/CoreyJ
* mon_dog.mdl, h_dog.mdl and player.mdl by Capnbubs
* mon_soldier.mdl by Capnbubs, h_soldier.mdl and additional skins by SimonOC
* mon_enforcer.mdl by ID Software, additional skins by SimonOC
* mon_centurion.mdl, h_centurion.mdl from rubicon2 MOD, extra skins by SimonOC
* mon_pyro.mdl, h_pyro.mdl from rubicon2 MOD, extra skins by SimonOC
* mon_boss.mdl by ID Software, Red skin by MatthewB, Green skin by SimonOC
* mon_shalrath by ID Software, new green/purple skin by SimonOC
* mon_zombie by ID Software, seven new skins based on ID/Rogue Software work
* mon_zombiek.mdl, h_zombiek.mdl by MatthewB (melee zombie)
* mon_voreling.mdl and gib model from Quoth MOD with new animation by SimonOC
* mon_drole.mdl, h_drole.mdl from Quoth MOD with new gibs by SimonOC
* mon_gaunt.mdl, h_gaunt.mdl from Quoth MOD (Kell/CoreyJ/AndrewD)
* mon_spider.mdl by Raven Software, new animation and green skin by SimonOC
* mon_scorpion.mdl by Raven Software, extra gib models and skins by SimonOC
* mon_gargoyle.mdl by Raven Software, additional gibs cut from main model
* mon_wraith.mdl, gib_wraith1-3.mdl by Rogue Software, new skins by SimonOC
* mon_jim.mdl,mon_jimrock.mdl based on bob from Quoth; skin+animations by SimonOC
* mon_lostsoul.mdl; model based on skull by id software, skin / animation by SimonOC
* mon_minotaur.mdl by Raven Software, additional gibs/head models by SimonOC
* mon_golem.mdl by Raven Software, skin and additional gibs models by SimonOC
* mon_skullwiz.mdl, h_skullwiz.mdl, w_skullbook.mdl by Raven Software

MISC MODELS
* All breakable bmodels by SimonOC (source map files included)
* b_health_15, b_health_25, b_health_100.mdl by SimonOC, based on BSPs by LouisM
* v_shot2.mdl, v_nail.mdl, v_nail2.mdl, armour.mdl, flame.mdl by SimonOC, originally ID
* g_shot3.mdl, v_shot3.mdl, g_plasma.mdl, v_plasma.mdl (slapmap.wordpress.com)
* g_zershot.mdl, v_zershot.mdl, riotshot.wav from Zerstorer MOD (not used anymore)
* v_shadowaxe.mdl based on axe from lunsp2 by MatthewB, skins by SimonOC
* key_base.mdl, key_medieval.mdl, key_runic.mdl rebuilt by SimonOC, originally ID
* misc_spark.mdl, s_spark.spr key_circuit.mdl, g_shotgun.mdl from Rubicon2 by JohnFitz
* s_steam.spr, s_flame.spr, steamloop.wav & steamoff.wav from Rubicon2 by JohnFitz
* misc_cable.mdl, misc_dpull_s.mdl, misc_levels.mdl, misc_mooring.mdl, by AndrewD
* misc_oscill.mdl, misc_qwindow.mdl, misc_smoke.mdl, misc_starfield.mdl by AndrewD
* misc_mushroom.mdl, misc_tape.mdl, v_nail.mdl animation by AndrewD (tomeofpreach.wordpress.com)
* s_explodmed.spr, s_explodbig.spr and s_plasma.spr from Quoth MOD
* misc_chain.mdl, s_waterdrip.spr and s_watersplash.spr from RRP/RMQ mod by LouisM
* all bubble/dot sprite particles by SimonOC (bubbles Originally ID)
* misc_radar64.mdl, _radar96.mdl and _radar128.mdl model+skin by SimonOC
* misc_candle1-3.mdl based on original model by Rogue Software, remade by SimonOC
* artifact_piercer.mdl, artifact_sharp.mdl model by SimonOC, skins by MatthewB
* trap_pendlong.mdl, trap_pendshort.mdl, trap_buzzsaw.mdl by Rogue Software
* misc_bonepile.mdl, _skull.mdl, _stickskull1/2.mdl by Raven Software, +skins by SimonOC
* misc_flag.mdl, misc_lantern.mdl, misc_seaweed.mdl by Raven Software, +skins by SimonOC
* misc_tutstatue.mdl, misc_tree.mdl by Raven Software, +skins by SimonOC
* misc_lightpost.mdl, misc_lighttube.mdl from Quoth, misc_fixture1.mdl from Rubicon2
* explode_box1.mdl & _box2.mdl based on model by id, with skins by rubicon2 / Quoth MOD
* misc_madfish.mdl based on the original fish model by MadFox (single loop)
* misc_tree2.mdl model+skin by MatthewB

SOUNDS
* Spider, Gargoyle, Golem & Minotaur sounds by Raven Software, cleaned up by SimonOC
* Scorpion sound effects by Valve Software, renamed and mixed to suit Quake
* Bob, Drole, Gaunt, Voreling and some enforcer/soldier sound effects from Quoth MOD
* nofire, secret3 and demonwind sounds from Marchers Fortress by BenW
* All ladder sounds (metal/wood/rope) from (www.freesound.org) mixed by SimonOC
* New gib sounds are originally from UT (except stone stuff)
* New SG/SSG and Lost soul sound effects from Doom by Id Software
* generator_gas, lowboom, machine_loop1, machine_loop2 from RRP mod
* new ambience sound directory from many different sources
  + some from (www.freesound.org) mixed by me with Audacity
  + All windgust, thunder and rubble sounds made by Marauder
  + All liquid sounds from Quake3 by Id software, I know, they are so good!
* All breakable initial/impact sounds from Quoth MOD (Kell/CoreyJ/AndrewD)
* Wraith and misc_shake sounds by Rogue Software, mixed by SimonOC using Audacity

ARTWORK
* Moonrise skybox made with Terragen 3.x by SimonOC
* Interstellar, Swampn and Violent skybox made by Hipshot
* Daikatana (DK3) stone textures (ad_test4, start) by Ion Storm
* Egyptian stone textures (ad_test6) by Rogue Software
* Knave brick/library texures (ad_test7) by Kell
* SpeedBlaze base texture (start) by Speedy

==============================================================================
copyright:        Please do not use any of these assets in ANY COMMERCIAL PROJECT.
                  Remember to give credit if you use any of these assets.

engine:           Designed and tested to work with the following engines:

QuakeSpasm http://celephais.net/board/view_thread.php?id=60452
DarkPlaces https://icculus.org/twilight/darkplaces/

==============================================================================
Distribution / Copyright / Permissions 

The QC files in this MOD are based on 1.06 source files by ID Software.
These files are released under the terms of GNU General Public License v2 or
later. You may use the source files as a base to build your own MODs as long
as you release them under the same license and make the source available.
Please also give proper credit. Check http://www.gnu.org for details.

Quake I is a registered trademark of id Software, Inc.

All of these resources may be electronically distributed only at 
NO CHARGE to the recipient in its current state and MUST include this 
readme.txt file.

==============================================================================